코딩 기록들
[Database Programming] 8. 재귀조인 Recursive Join 본문
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)하면, 아래 밑줄과 같이 표현가능