##계층형 쿼리란?
ex) 조직도, 부서 등..
위 그림의 관계를 테이블로 구성
CREATE TABLE TB_CMM_DEPT
(
DEPT_CD VARCHAR2(8) NOT NULL PRIMARY KEY,
PAR_DEPT_CD VARCHAR2(8), -- 상위 부서 코드
DEPT_NM VARCHAR2(50), -- 부서 코드
USE_YN CHAR(1),
REG_DTM DATE,
REG_USER VARCHAR2(30),
MOD_DTM DATE,
MOD_USER VARCHAR2(30)
);
START WITH 구문에서는 어떤 레코드를 최상위 레코드로 잡을지 지정한다.
ex) 최상위 부서를 최상위 레코드로 두는 경우
SELECT * FROM TB_CMM_DEPT
START WITH PAR_DEPT_CD IS NULL
이 절을 이용하여 계층 질의에서 상위계층(부모행)과 하위계층(자식행)의 관계를 규정할 수 있다.
PRIOR 연산자와 함께 사용하여 계층구조로 표현할 수 있다.
CONNECT BY PRIOR 자식컬럼 = 부모컬럼 -> 부모에서 자식으로 트리 구성 (Top Down)
CONNECT BY PRIOR 부모컬럼 = 자식컬럼 -> 자식에서 부모로 트리 구성(Bottom Up)
부모행 방향으로 전개(Bottom-Up)
자식행 방향으로 전개(Top-Down)
방향은 'PRIOR'가 어디에 지정되어 있냐에 따라 달라지는데 PRIOR가 없는 곳에서 PRIOR가 있는 곳으로 전개된다.
LEVEL은 계층구조 쿼리에서 수행 결과의 Depth를 표현하는 의사컬럼이다.
의사컬럼이란 '가짜 컬럼'을 의미한다. 즉, 테이블 생성 시에 DBA나 생성자가 별도로 정의한 컬럼이 아니다. 단순하게 레코드들이 최상의 레코드로부터 몇 단계 깊이에 있는지를 참고하는 용도로만 사용된다.
ex)
LVL DEPT_CD PAR_DEPT_CD DEPT_NM
--- --------- ----------- -------------
1 DEPT_002 DEPT_001 경영지원부
2 DEPT_004 DEPT_002 회계팀
2 DEPT_005 DEPT_002 인사팀
2 DEPT_006 DEPT_002 재무팀
1 DEPT_003 DEPT_001 영업본부
2 DEPT_007 DEPT_003 국내영업팀
2 DEPT_008 DEPT_003 해외영업팀
2 DEPT_009 DEPT_003 영업기획팀
2 DEPT_010 DEPT_003 영업지원팀
ex)
SELECT SYS_CONNECT_BY_PATH('DEPT_NM',',') D_NAME
FROM A
START WITH TB_CMM_DEPT
START WITH PAR_DEPT_CD IS NULL
CONNECT BY PRIOR DEPT_CD = PAR_DEPT_CD
-- 결과
D_NAME
----------
,경영지원부
,경영지원부,회계팀
,경영지원부,인사팀
...