Oracle在层次查询处理中,既可以从表的根部开始搜索到最后的树叶,也可以根据需要只搜索其中的某些分枝。
✿ 问题的提出
在企业的信息化查询处理中,除了从表的根部开始搜索到最后的树叶外,有时候需要从树根开始搜索,但是在分枝的处理上只要求搜索其中的某些分枝,从而得到所感兴趣的信息。那么如何才能实现这一要求呢?
✿ 实现技术
要实现消除一些分枝不进行搜索,需要在CONNECT BY
子句上再加AND
条件,以实现对结果的再筛选。
✿ 实现步骤
下面例子从mgr
列为NULL
开始搜索:
SQL> --下面语句 :
col name for a30
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 行
--下面语句再用AND 对结果再筛选:
SELECT lpad(' ',4*(LEVEL-1)) ||ename name ,empno,mgr, LEVEL
FROM emp
START WITH mgr IS NULL
CONNECT BY PRIOR empno = mgr
AND ename != 'BLAKE';
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
CLARK 7782 7839 2
MILLER 7934 7782 3
已选择8行。
✿ 说明
需要注意的是,要消除对某个分枝的搜索,必须在CONNECT BY
子句后进行筛选,而不能通过WHERE
条件来限制。