博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

wifox

  wifox.cublog.cn

关于作者
姓名:水狐
职业:IT
年龄:**
位置:南方
个性介绍:快准狠
|| << >> ||
我的分类


oralce树结构查询2

4.使用LEVEL

       在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2 依此类推。图1.2就表示了树结构的层次。                                                          

 

 

 

                                                                           层号

KING                                     1

 


JONES                                  BLAKE                                CLARK  2

                                                                       MILLER 3

SCOTT  FORD       ALLEN     WARD   MARTIN       TURNER         JAMES

ADAMS  SMITH                                                                           4

图案1.2 EMP表树结构层次图

 

       在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。

       5显示EMP表中的各行数据及层号。

          SQL>SELECT LEVELEMPNOMGR

              FROM EMP

              CONNECT BY PRIOR EMPNO=MGR

              START WITH ENAME=KING’;

LEVEL           EMPNO         ENAME         MGR

1            7839              KING            

2            7566              JONES           7839

3            7788              SCOTT          7566

4            7876              ADAMS         7788

3            7902              FORD            7566

4            7369              SMITH          7902

2            7698              BLAKE           7839

3            7499              ALLEN          7698

3            7521              WARD           7698

3            7654              MARTIN 7698

3            7844              TURNER 7698

3            7900              JAMES          7698

2            7782              CLARK          7839

3            7934              MILLER  7782

14 rows selected.

伪列LEVEL为数值型,可以在SELECT 命令中用语各种计算机。

6 使用LEVEL改变查询结果的显示形式。

SQL>COLUMN EMPLOYEE FORMAT A20

SQL> SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR

      FROM EMP

      CONNECT BY PRIORY EMPNO=EMR

      START WITH ENAME=’KING’;

EMPNO         EMPLOYEE                 MGR

7839                                          KING            

7566                 JONES                   7839

7788                    SCOTT                    7566

7876                       ADAMS              7788

7902                    FORD               7566

7369                       SMITH                7902

7698                 BLAKE                   7839

7499                    ALLEN                     7698

7521                    WARD               7698

7654                    MARTIN                  7698

7844                    TURNER                  7698

7900                    JAMES                     7698

7782                 CLARK                   7839

7934                    MILLER                   7782

14 rows selected.

SELECT使用了函数RPAD,该函数表示以LEVEL*3个空格进行填充,由于不同行处于不同的节点位置,具有不同的LEVEL值,因此填充的空格数将根据各自的层号确定,空格再与雇员名字拼接,结果显示出这种层次关系,也就是说其雇员名字右侧填充的空格数与它的层数有关。

5.节点和分支的裁剪

在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

SQL>COLUMN EMPLOYEE FORMAT A20

SQL> SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR

          FROM EMP

          WHERE ENAME!=’SCOTT’

            CONNECT BY PRIORY EMPNO=EMR

          START WITH ENAME=’KING’;

 

 

EMPNO         EMPLOYEE                 MGR

7840                                          KING            

7566                 JONES                   7839

7876                       ADAMS              7788

7902                    FORD               7566

7369                       SMITH                7902

7698                 BLAKE                   7839

7499                    ALLEN                     7698

7521                    WARD               7698

7654                    MARTIN                  7698

7844                    TURNER                  7698

7900                    JAMES                     7698

7782                 CLARK                   7839

7934                   MILLER                   7782

13 rows selected.

在这个查询中,仅剪去了树中单个节点SCOTT。若希望剪去树结构中的某个分支,则要用CONNECT BY 子句。CONNECT BY 子句是限定树型结构中的整个分支,既要剪除分支上的单个节点,也要剪除其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

8.显示KING领导下的全体雇员信息,除去SCOTT领导的一支。

SQL> SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR

          FROM EMP

          CONNECT BY PRIORY EMPNO=EMR

          AND ENAME!=’SCOTT’

          START WITH ENAME=’KING’;

EMPNO         EMPLOYEE                 MGR

7841                                          KING            

7566                 JONES                   7839

7902                    FORD               7566

7369                       SMITH                7902

7698                 BLAKE                   7839

7499                    ALLEN                     7698

7521                    WARD               7698

7654                    MARTIN                  7698

7844                    TURNER                  7698

7900                    JAMES                     7698

7782                 CLARK                   7839

7934                    MILLER                   7782

12 rows selected.

这个查询结果就与例7不同,除了剪去单个节点SCOTT外,还将SCOTT的子节点ADAMS剪掉,即把SCOTT这个分支剪掉了。

当然WHERE子句可以和CONNECT BY子句联合使用,这样能够同时剪掉单个节点和树中的某个分支。

9.显示KING领导全体雇员信息,除去雇员SCOTT,以及BLAKE领导的一支。

SQL>COLUMN EMPLOYEE FORMAT A20

SQL> SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR

          FROM EMP

          WHERE ENAME!=’SCOTT’

            CONNECT BY PRIORY EMPNO=EMR

          AND ENAME!=’BLAKE

          START WITH ENAME=’KING’;

EMPNO         EMPLOYEE                 MGR

7842                                          KING            

7566                 JONES                   7839

7876                       ADAMS              7788

7902                    FORD               7566

7369                       SMITH                7902

7782                 CLARK                   7839

7934                    MILLER                   7782

7 rows selected.

6.排序显示

象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。

例10          EMPNO的顺序显示树结构EMP 中的数据。

SQL> SELECT EMPNO,ENAMEMGR

      FROM EMP

      CONNECT BY PRIOR EMPNO=MGR

              START WITH ENAME=’KING’;

              ORDER BY EMPNO

 

 

 

 

EMPNO         ENAME         MGR

7369              SMITH          7902

7499              ALLEN          7698

7521              WARD           7698

7566              JONES           7839

7654              MARTIN 7698

7698              BLAKE           7839

7782              CLARK          7839

7788              SCOTT          7566

7839                                          KING

7844              TURNER 7698

7876              ADAMS         7788

7900              JAMES          7698

7902              FORD            7566

7934              MILLER  7782

14 rows selected.

在使用SELECT 语句来报告树结构报表时应当注意,CONNECT BY子句不能作用于出现在WHERE子句中的表连接。如果需要进行连接,可以先用树结构建立一个视图,再将这个视图与其他表连接,以完成所需要的查询。

发表于: 2007-03-08,修改于: 2007-03-08 10:25,已浏览615次,有评论0条 推荐 投诉


网友评论
 发表评论