코딩 기록들

[Database Programming] 8. 재귀조인 Recursive Join 본문

카테고리 없음

[Database Programming] 8. 재귀조인 Recursive Join

코딩펭귄 2024. 2. 21. 13:08

Recursive Join

- 데이터베이스마다 표현하는 방식이 다름 

- 한 테이블에 PK가 존재하고, 해당 PK를 참조하는 FK가 동시에 있는 경우의 조인

- 주로 계층형 관계에 이용(like 조직도)

  ex) EMPLOYEES 테이블

    - 여러 명의 사원(EMPLOYEE_ID: PK)은 한 명의 상사(MANAGER_ID: FK)가 있다

    - 동일 테이블에서 참조가 이루어지고 있음

계층형 트리의 구조 표현방식

    -최상위 노드 = Root Node

    -최하위 노드 : Leaf Node

 

100번 사원의 부하직원들을 모두 조회하는 쿼리

 

 SELECT LEVEL 
      , EMPLOYEE_ID
 	  , FIRST_NAME || ' ' || LAST_NAME AS NAME --한줄로 연결
 	  , MANAGER_ID
   FROM EMPLOYEES
   --START WITH 최상위 ROW가 될 기준 -> 루트노드=100 이라고 지정해 주는것
  START WITH EMPLOYEE_ID = 100 --100번사원의 MANAGER_ID가 0이므로 Root Node로 지정
--CONNECT BY 데이터를 연결할 기준;
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID --연결 조건 지정
;										  --사원번호 100번은 누군가의 상사사원번호다
-- 100번부터 시작해서 모든 부하직원들을 계층구조로 조회된다.

( 마리아, sql server 등등에서는 recursive로 표현함)

- > EMPLOYEE_ID(100)가 누군가의 MANAGER_ID(100)가 되어야 한다.

- 연결된 모든 부하직원들을 조회한다.

 

SELECT LEVEL 

트리의 레벨 보여준다

 

쿠팡 화면에서 메뉴항목에 보면 1,2,3,4로 레벨 나뉘어져있는것을 볼 수 있다

 

108번사원의 모든 부하직원들을 계층형(조직도) 구조로 조회한다

-- ROOT NODE ==> 108

 SELECT LEVEL 
      , EMPLOYEE_ID
      , FIRST_NAME || ' ' || LAST_NAME AS NAME
      , MANAGER_ID
   FROM EMPLOYEES
  START WITH EMPLOYEE_ID = 108 --113
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID 
; -- ROOT NODE를 108로 지정했기때문에, 108번의 LEVEL이 1로 변경됨

 

113번의 모든상사를 계층형(조직도) 구조로 조회한다
 SELECT LEVEL 
      , EMPLOYEE_ID
      , FIRST_NAME || ' ' || LAST_NAME AS NAME
      , MANAGER_ID
   FROM EMPLOYEES
  START WITH EMPLOYEE_ID = 113
CONNECT BY PRIOR MANAGER_ID = EMPLOYEE_ID --113의 상사번호는 누군가의 사원번호
  ORDER BY LEVEL DESC
;

-> 계층구조의 역순을 조회(ORDER BY LEVEL DESC)하면, 아래 밑줄과 같이 표현가능