层次化查询,顾名思义就是把查询结果有层次的呈现出来。层次化查询结果类似于树状结构,
最顶端的是“根节点”,
下面是“父节点”,
没有子节点的是“叶节点”。
为了让一个或多个表具有层次关系,必须使用相关的字段将表关联起来。比如SCOTT用户下的SCOTT.EMP表中的EMPNO和MGR列。
基本语法为:
[START WITH conditiona1] CONNECT BY condition2
START WITH conditiona1:用来指定根节点,condition1中可以加子查询。
CONNECT BY condition2:condition2中必须包含PRIOR关键字,用来指定列是来自父行。PRIOR可以位于比较操作符的任何一方。condition不能包含子查询。
如:
打开sql窗口:
SELECT T.EMPNO,T.MGR,T.ENAME,T.HIREDATE
FROM SCOTT.EMP T
START WITH T.MGR IS NULL
CONNECT BY PRIOR T.EMPNO = T.MGR;
EMPNO MGR ENAME HIREDATE
----------------------------------------------------------------------
1 7839 KING 1981/11/17
2 7566 7839 JONES 1981/4/2
3 7788 7566 SCOTT 1987/4/19
4 7876 7788 ADAMS 1987/5/23
5 7902 7566 FORD 1981/12/3
6 7369 7902 SMITH 1980/12/17
7 7698 7839 BLAKE 1981/5/1
8 7499 7698 ALLEN 1981/2/20
9 7521 7698 WARD 1981/2/22
10 7654 7698 MARTIN 1981/9/28
11 7844 7698 TURNER 1981/9/8
12 7900 7698 JAMES 1981/12/3
13 7782 7839 CLARK 1981/6/9
14 7934 7782 MILLER 1982/1/23
为了知道当前查询树状结构所处的层次,可以使用level伪列。加入level伪列后显示如下:
SELECT LEVEL,
LPAD(' ',2 * (LEVEL - 1)) || T.ENAME "EmpName",
T.HIREDATE,
T.SAL
FROM SCOTT.EMP T
START WITH T.MGR IS NULL
CONNECT BY T.MGR = PRIOR T.EMPNO;