말 그대로 나 자신과의 조인! FROM
절에 같은 테이블이 두 번 이상 등장
-> 혼란 방지를 위해서 ALIAS
필수
SELECT A.TYPE , A.NAME, B.TYPE, B.NAME , C.TYPE, C.NAME
FROM table A, table B, table C
WHERE A.NAME = B.parentNAME
AND B.NAME = C.parentNAME ;
테이블에 셀프조인이 반복 되어 계층 구조를 이루는 컬럼이 존재할 경우 계층 쿼리
를 이용하여 데이터 출력이 가능하다!
PRIOR
가 부모 노드에 붙어있으면 역방향
PRIOR
가 자식 노드에 붙어있으면 순방향
순방향 계층 쿼리 (루트 -> 리프)
SELECT LEVEL, SYS_CONNECT_BY_PATH (NAME, '--') AS path FROM table START WITH parentNAME IS NULL CONNECT BY PRIOR NAME = parentNAME ;
LEVEL
: 현재의 DEPTH를 반환 루트 노드 = 1SYS_CONNECT_BY_PATH(컬럼 , 구분자)
: 루트 노드부터 현재 노드까지의 경로를 출력START WITH
: 경로가 시작되는 루트 노드를 생성CONNECT BY
: 루트로부터 자식 노드를 생성해준다. 조건에 만족하는 데이터가 없을 때까지 생성CONNECT BY
PRIOR
자식(하위) = 부모(상위) ;
: 이전LEVEL
의 자식 컬럼 값이 , 현재 행의 부모 컬럼과 동일한 값이면 현재 행에서 이전LEVEL
의 +1을 세팅한다.
PRIOR(이전)
의 상위부서번호가 LEVEL값을 매기려하는 행의 부서번호와 같을 때, LEVEL 2를 setting한다.
START WITH
로LEVEL
1을 셋팅- 상위부서번호가 NULL인데, 부서번호가 NULL인 행이 없으므로 한 행만 출력 후 종료
역방향 계층 쿼리 (리프 -> 루트)
SELECT LEVEL, SYS_CONNECT_BY_PATH (NAME, '--') FROM table START WITH TYPE = 'bottom' CONNECT BY NAME = PRIOR parentNAME ;
START WITH TYPE
을 하위 노드로 잡아준다.CONNECT BY
PRIOR
부모(상위) = 자식(하위) ;
ORDER SIBILING BY
로 정렬, 같은 레벨끼리 정렬된다.
정렬전
정렬후
왜 똑같ㅌ냐