LEVEL은 계층 질의 결과 행의 깊이 레벨(depth)을 나타내는 의사 컬럼(pseudo column)이다. 루트 노드의 LEVEL은 1이며, 하위 자식 노드의 LEVEL은 2가 된다.
LEVEL 의사 컬럼은 SELECT 문 내의 WHERE 절, ORDER BY 절, GROUP BY ... HAVING 절에서 사용 가능하며, 집계 함수를 이용하는 구문에서도 사용 가능하다.
다음은 노드의 레벨을 확인하기 위하여 LEVEL 값을 조회하는 예제이다.
-- LEVEL의 값을 확인하기
SELECT id, mgrid, name, LEVEL
FROM tree
WHERE LEVEL=2
START WITH mgrid IS NULL
CONNECT BY PRIOR id=mgrid
ORDER BY id;
id mgrid name level
=========================================
3 1 Jonas 2
4 1 Smith 2
5 2 Verma 2
6 2 Foster 2
CONNECT_BY_ISLEAF는 계층 질의 결과 행이 리프 노드(leaf node : 하위에 자식 노드를 가지지 않는 단말 노드)인지 가리키는 의사 컬럼이다. 계층 구조 하에서 현재 행이 리프 노드이면 1을 반환하고, 그렇지 않으면 0을 반환한다.
다음은 리프 노드를 확인하기 위하여 CONNECT_BY_ISLEAF 값을 조회하는 예제이다.
-- CONNECT_BY_ISLEAF의 값을 확인하기
SELECT id, mgrid, name, CONNECT_BY_ISLEAF
FROM tree
START WITH mgrid IS NULL
CONNECT BY PRIOR id=mgrid
ORDER BY id;
id mgrid name connect_by_isleaf
===========================================================
1 null Kim 0
2 null Moy 0
3 1 Jonas 1
4 1 Smith 1
5 2 Verma 1
6 2 Foster 0
7 6 Brown 1
CONNECT_BY_ISCYCLE은 계층 질의 결과 행이 루프를 발생시키는 행인지를 가리키는 의사 컬럼이다. 즉, 현재 행의 자식이 동시에 조상이 되어 루프를 발생시키는 경우 1을 반환하고, 그렇지 않으면 0을 반환한다.
CONNECT_BY_ISCYCLE 의사 컬럼은 SELECT 문 내의 WHERE 절, ORDER BY 절, GROUP BY ... HAVING 절에서 사용할 수 있으며, 집계 함수를 이용하는 구문에서도 사용 가능하다.
참고 CONNECT_BY_ISCYCLE은 CONNECT BY 절에 NOCYCLE 키워드가 명시되는 경우에만 사용할 수 있다.
다음은 루프를 발생시키는 행을 확인하기 위해 CONNECT_BY_ISCYCE 값을 조회하는 예제이다.
-- CONNECT_BY_ISCYCLE의 값을 확인하기
SELECT id, mgrid, name, CONNECT_BY_ISCYCLE
FROM tree_cycle
START WITH name in ('Kim', 'Moy')
CONNECT BY NOCYCLE PRIOR id=mgrid
ORDER BY id;
id mgrid name connect_by_iscycle
==========================================================
1 null Kim 0
2 11 Moy 0
3 1 Jonas 0
4 1 Smith 0
5 3 Verma 0
6 3 Foster 0
7 4 Brown 0
8 4 Lin 0
9 2 Edwin 0
10 9 Audrey 0
11 10 Stone 1