계층형 질의 (Hierarchical Query)

17713117619752408614114022795356.png

타입 키워드 설명
가상 컬럼 LEVEL • 전체 계층 구조에서 현재의 레벨 또는 깊이 (Depth) 를 반환
• 루트 노드가 1이 되며 레벨이 내려갈 때마다 1씩 증가
가상 컬럼 CONNECT_BY_ISLEAF • 가장 말단 노드면 1을 반환하고 그 외에는 0을 반환
가상 컬럼 CONNECT_BY_ISCYCLE • 자식 노드가 조상 노드이면 1, 그렇지 않으면 0
• 조상 노드: 자신으로부터 루트까지의 경로에 존재하는 데이터
• CYCLE 옵션을 사용했을 때만 사용 가능
함수 SYS_CONNECT_BY_PATH • 최상위 루트 노드로부터 현재 노드까지의 경로를 출력하는 함수
함수 CONNECT_BY_ROOT • 루트 노드의 지정된 컬럼 값을 반환
계층형 질의 절 (Clause) START WITH • 루트 데이터 지정
계층형 질의 절 (Clause) CONNECT BY • 자식 데이터 지정
단항 연산자 PRIOR • CONNECT_BY 절에 사용되며, 현재 읽은 컬럼 지정
• PRIOR 자식=부모: 부모 → 자식 방향으로 순방향 전개
• PRIOR 부모=자식: 자식 → 부모 방향으로 역방향 전개
옵션 키워드 NOCYCLE • 사이클 발생 이후의 데이터를 전개하지 않음으로써 무한 루프 방지
정렬 절 (Clause) ORDER SIBLINGS BY • 같은 레벨의 형제 (Sibling) 노드끼리 정렬

쿼리 예시

순방향 전개

SELECT LEVEL,
	LPAD(' ', 4 * (LEVEL - 1)) || EMPNO 사원,
	MSG 관리자,
	CONNECT_BY_ISLEAF ISLEAF
FROM EMP
START WITH MGR IS NULL 
CONNECT BY PRIOR EMPNO = MGR;

17713127412203415861078946399977.png

역방향 전개

SELECT LEVEL,
	LPAD(' ', 4 * (LEVEL - 1)) || 사원 사원,
	관리자,
	CONNECT_BY_ISLEAF ISLEAF
FROM 사원
START WITH 사원 = 'D'
CONNECT BY PRIOR 관리자 = 사원;