ORACLE 提供了一个有趣的功能 connect by 子句,它可以对具有家族树结构的分枝进行排序。它的用途有 机构或公司的各层结构,财务的科目代码等。 要使用查询遍历,需要在将数据在基表中按照层次结构进行存储。比如一个组织机构就是这样的典型例子。实现语句:SELECT column FROM table_name START WITH column=value CONNECT BY PRIOR 父主键=子外键
§7.3.1 排除单一体和分枝 例1:在ORACLE的EMP 表中,每一条记录都有一个唯一标识当前雇员的empno和标识这个雇员的经理的mgr列。如果mgr 为空,则该雇员是该机构的最顶级。现在要列出每个雇员的层次结构(从顶到底):select lpad(' ',4*(level-1))||ename name ,empno,mgr from emp start with mgr is null connect by prior empno=mgr;NAME EMPNO MGR -------------------- --------- --------- KING 7839 JONES 7566 7839 SCOTT 7788 7566 ADAMS 7876 7788 FORD 7902 7566 SMITH 7369 7902 BLAKE 7698 7839 ALLEN 7499 7698 WARD 7521 7698 MARTIN 7654 7698 TURNER 7844 7698 JAMES 7900 7698 CLARK 7782 7839 MILLER 7934 778214 rows selected.SQL>从查询结果中可以看出,由于JONES、BLAKE、CLARK的上司是KING,所以JONES等MGR(经理编号)=KING的empno号,即KING的直接下级是JONES、BLAKE、CLARK,因为他们的MGR与KING的EMPNO一样。§7.3.2 遍历至根 例2:现在要从某个雇员往他的上级列出该雇员的层次结构(从顶到底): SQL> col ename for a30 SQL> l select lpad(' ',4*(level-1))||ename ename,mgr,empno from emp start with mgr=7788 connect by prior mgr= empno SQL> /ENAME MGR EMPNO ------------------------------ ----- --------- ADAMS 7788 7876 SCOTT 7566 7788 JONES 7839 7566 KING 7839 例3:现在要列出所有雇员的层次结构(从顶到底): select lpad(' ',4*(level-1))||ename name ,empno,mgr from emp start with mgr is not null connect by empno=prior mgr NAME EMPNO MGR -------------------- --------- ----- SMITH 7369 7902 FORD 7902 7566 JONES 7566 7839 KING 7839 ALLEN 7499 7698 BLAKE 7698 7839 KING 7839 WARD 7521 7698 BLAKE 7698 7839 KING 7839 JONES 7566 7839 KING 7839 MARTIN 7654 7698 BLAKE 7698 7839 KING 7839 BLAKE 7698 7839 KING 7839 CLARK 7782 7839 KING 7839 SCOTT 7788 7566 JONES 7566 7839 KING 7839 TURNER 7844 7698 BLAKE 7698 7839 KING 7839 ADAMS 7876 7788 SCOTT 7788 7566 JONES 7566 7839 KING 7839 JAMES 7900 7698 BLAKE 7698 7839 KING 7839 FORD 7902 7566 JONES 7566 7839 KING 7839 MILLER 7934 7782 CLARK 7782 7839 KING 783938 rows selected.
要使用查询遍历,需要在将数据在基表中按照层次结构进行存储。比如一个组织机构就是这样的典型例子。实现语句:SELECT column
FROM table_name
START WITH column=value
CONNECT BY PRIOR 父主键=子外键
例1:在ORACLE的EMP 表中,每一条记录都有一个唯一标识当前雇员的empno和标识这个雇员的经理的mgr列。如果mgr 为空,则该雇员是该机构的最顶级。现在要列出每个雇员的层次结构(从顶到底):select lpad(' ',4*(level-1))||ename name ,empno,mgr from emp
start with mgr is null
connect by prior empno=mgr;NAME EMPNO MGR
-------------------- --------- ---------
KING 7839
JONES 7566 7839
SCOTT 7788 7566
ADAMS 7876 7788
FORD 7902 7566
SMITH 7369 7902
BLAKE 7698 7839
ALLEN 7499 7698
WARD 7521 7698
MARTIN 7654 7698
TURNER 7844 7698
JAMES 7900 7698
CLARK 7782 7839
MILLER 7934 778214 rows selected.SQL>从查询结果中可以看出,由于JONES、BLAKE、CLARK的上司是KING,所以JONES等MGR(经理编号)=KING的empno号,即KING的直接下级是JONES、BLAKE、CLARK,因为他们的MGR与KING的EMPNO一样。§7.3.2 遍历至根
例2:现在要从某个雇员往他的上级列出该雇员的层次结构(从顶到底):
SQL> col ename for a30
SQL> l
select lpad(' ',4*(level-1))||ename ename,mgr,empno from emp
start with mgr=7788
connect by prior mgr= empno
SQL> /ENAME MGR EMPNO
------------------------------ ----- ---------
ADAMS 7788 7876
SCOTT 7566 7788
JONES 7839 7566
KING 7839
例3:现在要列出所有雇员的层次结构(从顶到底): select lpad(' ',4*(level-1))||ename name ,empno,mgr from emp
start with mgr is not null
connect by empno=prior mgr
NAME EMPNO MGR
-------------------- --------- -----
SMITH 7369 7902
FORD 7902 7566
JONES 7566 7839
KING 7839
ALLEN 7499 7698
BLAKE 7698 7839
KING 7839
WARD 7521 7698
BLAKE 7698 7839
KING 7839
JONES 7566 7839
KING 7839
MARTIN 7654 7698
BLAKE 7698 7839
KING 7839
BLAKE 7698 7839
KING 7839
CLARK 7782 7839
KING 7839
SCOTT 7788 7566
JONES 7566 7839
KING 7839
TURNER 7844 7698
BLAKE 7698 7839
KING 7839
ADAMS 7876 7788
SCOTT 7788 7566
JONES 7566 7839
KING 7839
JAMES 7900 7698
BLAKE 7698 7839
KING 7839
FORD 7902 7566
JONES 7566 7839
KING 7839
MILLER 7934 7782
CLARK 7782 7839
KING 783938 rows selected.
[email protected]