各位,我有个oracle的部门表
表的设计: 
ID    parentDep          childDep    .......... 
1        部门01              0 
2        部门02              0 
3        部门01的下属部门03    1                //注释childDep=0表示第一级目录,非0表示子目录, 
4    部门01的下属部门03的下属  3                //对应的数字为ID 
... 想通过一个select语句或者存储过程,就能找到一个指定部门的所有的下级部门,包含下级部门的下级部门,该如何写呢。
页面显示的话,我知道如果是用treeview控件,可以用递归,但是这我就想出来一个记录集。

解决方案 »

  1.   

    可以用connect by语句,实现递归层次关系,查找根结点等,
    我用scott下的emp表做个例子:
    SQL> select * from emp;     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
          7934 MILLER     CLERK           7782 23-1月 -82           1300                    10已选择14行。SQL> select connect_by_root empno rootEmp, empno, mgr from emp connect by nocycle prior empno = mgr;
       ROOTEMP      EMPNO        MGR
    ---------- ---------- ----------
          7788       7788       7566
          7788       7876       7788
          7902       7902       7566
          7902       7369       7902
          7499       7499       7698
          7521       7521       7698
          7900       7900       7698
          7844       7844       7698
          7654       7654       7698
          7934       7934       7782
          7876       7876       7788
          7566       7566       7839
          7566       7788       7566
          7566       7876       7788
          7566       7902       7566
          7566       7369       7902
          7782       7782       7839
          7782       7934       7782
          7698       7698       7839
          7698       7499       7698
          7698       7521       7698
          7698       7900       7698
          7698       7844       7698
          7698       7654       7698
          7369       7369       7902
          7839       7839
          7839       7566       7839
          7839       7788       7566
          7839       7876       7788
          7839       7902       7566
          7839       7369       7902
          7839       7782       7839
          7839       7934       7782
          7839       7698       7839
          7839       7499       7698
          7839       7521       7698
          7839       7900       7698
          7839       7844       7698
          7839       7654       7698已选择39行。
      

  2.   

    你都把parentDep描述的那么详细了,直接查不就行了?select * from 表 where parentDep like '部门01的下属部门%'这不是开玩笑,我就是这么做的ID    parentDep          childDep      deptIDW
    1      A                    0            0
    2      B                    0            0
    3      C                    2            2\3
    4      D                    3            2\3\4
    .......
    先把表多加一列deptIDW,就是部门所属关系的路径
    自己写的 GETDEPTIDW 方法,把所有部门路径找出来存上,以后做其他事有很大用处,我们用的是产品装配关系,用这种方法计算投产数量路径我想你写个路径的方法应该没问题的,就是递归调用,获取一个路径,然后存起来,然后查询的时候直接使用.
      

  3.   

    用sql得到组织结构树:
    SQL> select level, sys_connect_by_path(empno,'-') path from emp connect by prior empno = mgr;     LEVEL PATH
    ---------- --------------------------------------------------------------------------------
             1 -7788
             2 -7788-7876
             1 -7902
             2 -7902-7369
             1 -7499
             1 -7521
             1 -7900
             1 -7844
             1 -7654
             1 -7934
             1 -7876     LEVEL PATH
    ---------- --------------------------------------------------------------------------------
             1 -7566
             2 -7566-7788
             3 -7566-7788-7876
             2 -7566-7902
             3 -7566-7902-7369
             1 -7782
             2 -7782-7934
             1 -7698
             2 -7698-7499
             2 -7698-7521
             2 -7698-7900     LEVEL PATH
    ---------- --------------------------------------------------------------------------------
             2 -7698-7844
             2 -7698-7654
             1 -7369
             1 -7839
             2 -7839-7566
             3 -7839-7566-7788
             4 -7839-7566-7788-7876
             3 -7839-7566-7902
             4 -7839-7566-7902-7369
             2 -7839-7782
             3 -7839-7782-7934     LEVEL PATH
    ---------- --------------------------------------------------------------------------------
             2 -7839-7698
             3 -7839-7698-7499
             3 -7839-7698-7521
             3 -7839-7698-7900
             3 -7839-7698-7844
             3 -7839-7698-7654已选择39行。
      

  4.   

    其实是这样的
    ID    parentDep          childDep    .......... 
    1        部门01              0 
    2        部门02              0 
    3        部门03              1                //注释childDep=0表示第一级目录,非0表示子目录, 
    4        部门04                 3                //对应的数字为ID 只是为了大家看得清楚,才写这样细
      

  5.   


    try this:
    查询“部门01”的所有下级
    select * from tbl start with id='1' connect by prior id=childDep
      

  6.   

    顶5楼,如果有需要还可以用SYS_CONNECT_BY_PATH来展示树的层次结构
      

  7.   

    给你一个分级展示的例子,你一看就明白了:
    数据如下:(ORDR为单位序号,NUM1为单位人数,FAR为上级单位序号) 
    create table AA
    (
    ORDR int,
    NUM1 int,
    FAR int
    )
    insert into AA select '10','0','' from dual; 
    insert into AA select'1001','5','10' from dual; 
    insert into AA select'1002','5','10' from dual; 
    insert into AA select'20','0',''  from dual; 
    insert into AA select'2001','5','20' from dual; 
    insert into AA select '200101','5','2001' from dual; //展示一级
    select t.*
      from AA t
     where level = 1
     start with far is null
    connect by prior ORDR = FAR
    //展示二级
    select t.*
      from AA t
     where level = 1
        or level = 2
     start with far is null
    connect by prior ORDR = FAR
    //展示三级
    select t.* from AA t start with far is null connect by prior ORDR = FAR