계층형 질의는 테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해 사용한다.
게층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다.
SELECT ...
FROM 테이블
WHERE condition AND condition
START WITH condition
CONNECT BY [NOCYCLE] condition AND condition...
[ORDER SIBLINGS BY column, clolumn, ...]
구 문 | 설 명 |
---|---|
START WITH | 계층 구조 전개의 시작 위치 지정 (루트 데이터를 지정) |
CONNECT BY | 다음에 전기될 자식 데이터 지정 자식 데이터는 CONNECT BY절에 주어진 조건을 만족해야 한다.(조인) |
PRIOR | CONNECT BY 절에 사용되며, 현재 읽은 칼럼을 지정한다. PRIOR 자식 = 부모 형태를 사용하면 계층구조에서 부모 데이터에서 자식 데이터 (부모 -> 자식)방향으로 전개하는 순방향 전개를 한다. (반대는 역방향) |
NOCYCLE | 동일한 데이터가 전개되지 않음. |
ORDER SIBLINGS BY | 형제 노드(동일 LEVEL)간의 정렬을 수행 |
WHERE | 모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출(필터링) |
가상 칼럼 | 설명 |
---|---|
LEVEL | 루트 데이터이면 1, 그 하위 데이터이면 2, 리프데이터까지 1씩 증가 |
CONNECT_BY_ISLEAF | 전개 과정에서 해당 데이터가 리프 데이터이이면 1, 그렇지 않으면 0이다. |
CONNECT_BY_ISCYCLE | 해당 데이터가 조상이면1, 아니면0(CYCLE 옵션을 사용했을 시에만 사용가능) |
함수 | 설명 |
---|---|
SYS_CONNECT_BY_PATH | 루트 데이터 부터 현재 전개할 데이터까지의 경로를 표시
사용법 : SYS_CONNECT_BY_PATH(칼럼, 경로 분리자) |
CONNECT_BY_ROOT | 현재 전개할 데이터의 루트 데이터를 표시. 단항 연산자 이다.
사용법 : CONNECT_BY_ROOT 칼럼 |
SELECT LEVEL,EMPNO,MGR, CONNECT_BY_ISLEAF 리프
FROM EMP
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;
-> 결과
SELECT LEVEL, EMPNO, MGR, CONNECT_BY_ISLEAF 리프
FROM EMP
START WITH EMPNO = '7369'
CONNECT BY PRIOR MGR = EMPNO;
-> 결과
PRIOR에 부모자식 순서를 바꾸면 역방향 전개가 된다
SELECT CONNECT_BY_ROOT(EMPNO) 루트사원,
SYS_CONNECT_BY_PATH(EMPNO, '/') 경로,
EMPNO 사원,
MGR 관리자,
ENAME 이름
FROM EMP
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;
위 예제는 순방향 전개이다.
START WITH 에서 MGR IS NULL은
매니저가 존재하지 않는 가장 높은 사람부터 뽑겠다는 것이다.