我们可将表的各数据行的父-子关系看成一个倒挂的“树”,我们将最顶级称树根;而树根之后为分枝;分枝再包含下一级的分枝;最后一级为叶子。

✿ 问题的提出

在实际商业处理中,希望从树根开始搜索,然后按照表中各数据行之间存在的层次关系进行显示结果,那么如何实现这样的要求呢?

✿ 实现技术

要从树根开始搜索各数据行,直到最后的树的叶子,需要确定树根的起点,在emp表中,树根一级为KING,它的mgr为空(NULL);另外就是如何进行关联,关联的子句为CONNECT BY PRIOR

✿ 实现步骤

EMP表每一条记录都有一个唯一标识当前雇员的empno和标识这个雇员的经理的mgr列。如果mgr为空表示该雇员是该机构最顶级:

SQL> --下面语句查询EMP 表,并按照各数据行所处的级别给出层次展现:
SQL> select  LPAD(' ',4*(LEVEL-1))  ||ename name ,empno,mgr, LEVEL
from emp  start with mgr is null   connect by prior empno=mgr;
NAME                      EMPNO        MGR      LEVEL
-------------------- ---------- ---------- ----------
KING                       7839                     1
    JONES                  7566       7839          2
        SCOTT              7788       7566          3
            ADAMS          7876       7788          4
        FORD               7902       7566          3
            SMITH          7369       7902          4
    BLAKE                  7698       7839          2
        ALLEN              7499       7698          3
        WARD               7521       7698          3
        MARTIN             7654       7698          3
        TURNER             7844       7698          3
        JAMES              7900       7698          3
    CLARK                  7782       7839          2
        MILLER             7934       7782          3

14 rows selected.

✿ 说明

上例子中的START WITH表示从何处开始;而子句CONNECT BY表示指定了父记录行和子记录行之间的关系,在层次查询中,条件表达式必须使用PRIOR操作符来指定父记录行。