層次查詢,start with ... connect by ....

解决方案 »

  1.   

    ORACLE 提供了一个有趣的功能 connect by 子句,它可以对具有家族树结构的分枝进行排序。它的用途有 机构或公司的各层结构,财务的科目代码等。
    要使用查询遍历,需要在将数据在基表中按照层次结构进行存储。比如一个组织机构就是这样的典型例子。实现语句:SELECT column
    FROM  table_name
    START WITH  column=value
    CONNECT  BY  PRIOR  父主键=子外键
      

  2.   

    §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.
      

  3.   

    包子可以把你学习的东东给我发一份
    [email protected]