-
上面的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
|