source

Lookup에서 재귀 CTE를 사용하는 방법

factcode 2022. 9. 29. 00:11
반응형

Lookup에서 재귀 CTE를 사용하는 방법

SQL 연산자를 사용할 수 있을지조차 확신할 수 없는 매우 구체적인 사용 사례가 있습니다.

나는 가지고 있다users테이블, abranches테이블 및 ausers_to_branches보다.users_to_branches뷰가 존재합니다.필요하기 때문에id,username,그리고.branch_id부터users, 및 abranch_name(에는 없습니다.users) 및 a.parentBranch_id부터branches테이블.

현재 조직도는 몇 개의 레이어로 구성될 수 있습니다.branch_id는 사용자가 할당되어 있는 직접 브랜치입니다(예:재무) 단,parentBranch_id그 이상의 레벨입니다(예:X사)예를 들어, 하나 이상의 계층이 있는 경우 재무(예:부기)parentBranch_id파이낸스의 것이 될 것이다.branch_id내가 필요한 건 구조의 가장 높은 수준을 보는 거야parentBranch_id항상.그래서 부기의 경우로서branch_idX사를 보고 싶다parentBranch_id.

내가 보고 있는 논리는 무엇입니까?재귀적인 CTE를 사용해야 한다고 읽었습니다만, LOOKUP 기능을 구현하여 값을 전달하려면 어떻게 해야 합니까?

내 생각:이 함수는 항상 다음 사항을 확인해야 합니다.parentBranch_id. NULL인 경우,branch_id~하듯이parentBranch_id. NULL이 아닌 경우,parentBranch_id값어치branch_id컬럼 - NULL이 될 때까지.

재귀 CTE를 사용하면 각 브랜치 ID의 궁극적인 부모 브랜치를 얻을 수 있습니다.다음과 같은 경우:

with recursive cte as (
      select b.branch_id as ultimate_parent_branch_id, b.branch_id as branch_id
      from branches b
      where parent_branch_id is null
      union all
      select cte.ultimate_parent_branch_id, b.branch_id
      from cte join
           branches b
           on b.parent_branch_id = cte.branch_id           
     )
select *
from cte;

그럼 다시 접속해서 이걸 쓰면 되겠네요.users:

with recursive cte as (
      select b.branch_id as ultimate_parent_branch_id, b.branch_id as branch_id
      from branches b
      where parent_branch_id is null
      union all
      select cte.ultimate_parent_branch_id, b.branch_id
      from cte join
           branches b
           on b.parent_branch_id = cte.branch_id           
     )
select *
from users u join
     user_branches ub
     on u.user_id = ub.user_id join
     cte
     on cte.branch_id = ub.branch_id;

언급URL : https://stackoverflow.com/questions/67122843/how-to-use-recursive-cte-with-lookup

반응형