当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
Oracle树形查找(二)
发布时间:2010/9/21 10:15:38 来源:www.xue.net 编辑:城市总裁吧

  -

  上面的sql语句等同于下面的sql

  SQL> select empno,ename,level from emp start with empno=7788 connect by mgr=prior empno;

  EMPNO ENAME          LEVEL

  ----- ---------- ----------

  7788 SCOTT              1

  7876 ADAMS              2

  节点修剪和分支修剪

  比如对scott 7788做节点修剪,只影响scoot,adams不受影响

  SQL> select empno,ename,lpad(empno,length(empno)+(level-1)*4,'-') from emp where empno<>7788 start with mgr is null connect by prior empno=mgr;

  EMPNO ENAME     LPAD(EMPNO,LENGTH(EMPNO)+(LEVE

  ----- ---------- --------------------------------------------------------------------------------

  7839 KING      7839

  7566 JONES     ----7566

  7876 ADAMS     ------------7876

  7902 FORD      --------7902

  7369 SMITH     ------------7369

  7698 BLAKE     ----7698

  7499 ALLEN     --------7499

  7521 WARD      --------7521

  7654 MARTIN    --------7654

  7844 TURNER    --------7844

  7900 JAMES     --------7900

  7782 CLARK     ----7782

  7934 MILLER    --------7934

  对比下面的分支修剪,可以看到2者的区别,下面的语句不但scott修剪掉了,而且其子孙节点adams也被修剪掉了

  SQL> select empno,ename,lpad(empno,length(empno)+(level-1)*4,'-') from emp start with mgr is null connect by prior empno=mgr and empno<>7788;

  EMPNO ENAME     LPAD(EMPNO,LENGTH(EMPNO)+(LEVE

  ----- ---------- --------------------------------------------------------------------------------

  7839 KING      7839

  7566 JONES     ----7566

  7902 FORD      --------7902

  7369 SMITH     ------------7369

  7698 BLAKE     ----7698

  7499 ALLEN     --------7499

  7521 WARD      --------7521

  7654 MARTIN    --------7654

  7844 TURNER    --------7844

  7900 JAMES     --------7900

  7782 CLARK     ----7782

  7934 MILLER    --------7934

  Where条件和connect by中的条件也可以混合使用

  查找父结点是7689且节点empno不是7521的所有纪录

  SQL> select empno,ename,lpad(empno,length(empno)+(level-1)*4,'-') from emp wherepriorempno= 7698 start with mgr is null connect by prior empno=mgr and empno<>7521;

  EMPNO ENAME     LPAD(EMPNO,LENGTH(EMPNO)+(LEVE

  ----- ---------- --------------------------------------------------------------------------------

  7499 ALLEN     --------7499

  7654 MARTIN    --------7654

  7844 TURNER    --------7844

  7900 JAMES     --------7900

  伪列Level,prior,connect_by_isleaf,connect_by_root的使用

  SQL> select empno,ename,level,prior empno p_empno,connect_by_isleaf isleaf,connect_by_root empno r_empno from emp start with mgr is null connect by prior empno=mgr ;

  EMPNO ENAME          LEVEL   P_EMPNO    ISLEAF   R_EMPNO

  ----- ---------- ---------- ---------- ---------- ----------

  7839 KING               1                    0      7839

  7566 JONES              2      7839         0      7839

  7788 SCOTT              3      7566         0      7839

  7876 ADAMS              4      7788         1      7839

  7902 FORD               3      7566         0      7839

  7369 SMITH              4      7902         1      7839

  7698 BLAKE              2      7839         0      7839

  7499 ALLEN              3      7698         1      7839

  7521 WARD               3      7698         1      7839

  7654 MARTIN             3      7698         1      7839

  7844 TURNER             3      7698         1      7839

  7900 JAMES              3      7698         1      7839

  7782 CLARK              2      7839         0      7839

  7934 MILLER             3      7782         1      7839

  伪列connect_by_iscycle, sys_connect_by_path的使用

  SQL> select empno,ename,connect_by_iscycle iscycle,sys_connect_by_path(empno,'/') path_empno from emp start with mgr is null connect by nocycle prior empno=mgr ;

  EMPNO ENAME        ISCYCLE PATH_EMPNO

  ----- ---------- ---------- --------------------------------------------------------------------------------

  7839 KING               0 /7839

  7566 JONES              0 /7839/7566

  7788 SCOTT              0 /7839/7566/7788

  7876 ADAMS              0 /7839/7566/7788/7876

  7902 FORD               0 /7839/7566/7902

  7369 SMITH              0 /7839/7566/7902/7369

  7698 BLAKE              0 /7839/7698

  7499 ALLEN              0 /7839/7698/7499

  7521 WARD               0 /7839/7698/7521

  7654 MARTIN             0 /7839/7698/7654

  7844 TURNER             0 /7839/7698/7844

  7900 JAMES              0 /7839/7698/7900

  7782 CLARK              0 /7839/7782

  7934 MILLER             0 /7839/7782/7934

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved