oracle学习之:CONNECT BY层次化查询

来源:互联网 发布:文玩淘宝店 编辑:程序博客网 时间:2024/05/18 07:02

层次化查询,顾名思义就是把查询结果有层次的呈现出来。层次化查询结果类似于树状结构,

最顶端的是“根节点”,

下面是“父节点”,

没有子节点的是“叶节点”。

为了让一个或多个表具有层次关系,必须使用相关的字段将表关联起来。比如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;

   LEVEL    EmpName    HIREDATE        SAL
1    1    KING         1981/11/17    5000.00
2    2      JONES      1981/4/2      2975.00
3    3        SCOTT    1987/4/19    3000.00
4    4          ADAMS  1987/5/23    1100.00
5    3        FORD     1981/12/3    3000.00
6    4          SMITH  1980/12/17    800.00
7    2      BLAKE      1981/5/1     2850.00
8    3        ALLEN    1981/2/20    1600.00
9    3        WARD     1981/2/22    1250.00
10   3        MARTIN   1981/9/28    1250.00
11   3        TURNER   1981/9/8     1500.00
12   3        JAMES    1981/12/3    950.00
13   2      CLARK      1981/6/9     2450.00
14   3        MILLER   1982/1/23    1300.00