我们可将表的各数据行的父-子关系看成一个倒挂的“树”,我们将最顶级称树根;而树根之后为分枝;分枝再包含下一级的分枝;最后一级为叶子。
✿ 问题的提出
在实际商业处理中,希望从树根开始搜索,然后按照表中各数据行之间存在的层次关系进行显示结果,那么如何实现这样的要求呢?
✿ 实现技术
要从树根开始搜索各数据行,直到最后的树的叶子,需要确定树根的起点,在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
操作符来指定父记录行。