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条件来限制。