表结构是这样的:
部门表:
----------------------------------------------------------------------------------
字段名          含    义          数据类型          约束与备注 是否可空
DEPART_ID          部门编号          VARCHAR2 (10) PK              否
DEPART_NAME 部门名称          VARCHAR2 (40)              否
DEPART_CODE 部门代码          VARCHAR2 (20)              否
DEPART_ALIAS 部门别名          VARCHAR2 (40)              是
CHARGE_ID   上级部门编号 VARCHAR2 (10)              是
DEPART_LEVEL 部门级别          INTEGER                       否人员表:
----------------------------------------------------------------------------------
字段名          含    义          数据类型          约束与备注 是否可空
User_ID          人员编号          VARCHAR2 (10) PK              否
User_Name          人员姓名          VARCHAR2 (10)              否
Depart_ID          部门          VARCHAR2 (10)              否
下级部门的上级部门用CHARGE_ID 关联,从上面的结构可以满足无限级部门,人员只能属于最底层的部门,也就说一个部门下面如果有子部门就不会出现人员.
现在的问题是,我要根据一个DEPART_ID号把所有所属人员取出来,怎么办?

解决方案 »

  1.   

    转帖----------
    7. Oracle树的使用
    表    tree
      字段   master
           sub
           sales
      insert into tree values
      ('主1',   '主2',  15);  
      insert into tree values    
      ('主1',   '主3',  20);      
      insert into tree values
      ('主2',   '主4',  5);          
      insert into tree values
      ('主2',   '主5',  10);
      insert into tree values
      ('主3',   '主5',  30); 
      insert into tree values
      ('主3',   '主6',  40);
      
      SQL> select * from tree;
      MASTER   SUB       SALES
      ---------- ---------- ----------
      主1    主2        15
      主1    主3        20
      主2    主4         5
      主2    主5        10
      主3    主5        30
      主3    主6        40 
      
      如果用树型结构表示如下:
       '主1'          
         -'主2'        
           --'主4'
           --'主5'
       '主1'          
         -'主3'        
           --'主5'
           --'主6'
      
      SQL> select * from tree                 
      start with sub='主2'     --相当于普通sql的where条件
      connect by prior master=sub; --遍历的顺序是sub先于master遍历,也就是说从sub往上遍历一直到master(根节点)
       2 
      MASTER   SUB       SALES
      ---------- ---------- ----------
      主1    主2        15
      
      
      SQL> select * from tree                 
      start with master='主2' 
      connect by prior master=sub; --sub往上遍历至根节点(参考一下树型图)               
       2  3 
      MASTER   SUB       SALES      
      ---------- ---------- ----------       
      主2    主4         5  --这条是自己本身,也就是第一遍遍历
      主1    主2        15  --这是第2次遍历,我们从树型图可以看到,'主2'往上遍历是'主1'     
      主2    主5        10      
      主1    主2        15      
                            
                             
                            
      好,我们关看上面可能还是不好理解,我们加入一个树结构专用函数sys_connect_by_path,便于理解
      
      SQL> select sys_connect_by_path(MASTER,'/') from tree  --master表示我遍历的起点只找在master列中存在的,如下例只要'主2'为起点,并以/为分割符 
      start with master='主2' 
      connect by prior master=sub;  --往根节点遍历
       2  3 
      SYS_CONNECT_BY_PATH(MASTER,'/')
      --------------------------------------------------------------------------------
      /主2             --第1遍遍历
      /主2/主1          --第2遍遍历
      /主2             --第2条master='主2'的记录的第1次遍历
      /主2/主1          --第2条master='主2'的记录的第2次遍历
      
      SQL> select sys_connect_by_path(MASTER,'/') from tree --起点为sub='主5'时MASTER=主2,主3
      start with sub='主5' 
      connect by prior master=sub;
       2  3 
      SYS_CONNECT_BY_PATH(MASTER,'/')
      --------------------------------------------------------------------------------
      /主2
      /主2/主1
      /主3
      /主3/主1
      
      SQL> select sys_connect_by_path(MASTER,'/'),sub,master from tree   
      start with sub is not null 
      connect by prior master=sub; 
       2  3 
      SYS_CONNECT_BY_PATH(MASTER,'/' SUB    MASTER
      ------------------------------ ---------- ----------
      /主1              主2    主1 --找主1到根的路径,这里根是主1他自己
      /主1              主3    主1 
      /主2              主4    主2 
      /主2/主1           主2    主1 --找主2到根的路径,这里根是主1
      /主2              主5    主2
      /主2/主1           主2    主1 
      /主3              主5    主3 
      /主3/主1           主3    主1
      /主3              主6    主3
      /主3/主1           主3    主1  
      select sys_connect_by_path(MASTER,'/'),sub,master from tree                 
      start with sub is not null 
      connect by prior sub = master;                        
      
      SYS_CONNECT_BY_PATH(MASTER,'/' SUB    MASTER
      ------------------------------ ---------- ----------
      /主1              主2    主1
      /主1/主2           主4    主2
      /主1/主2           主5    主2
      /主1              主3    主1
      /主1/主3           主5    主3
      /主1/主3           主6    主3
      /主2              主4    主2
      /主2              主5    主2
      /主3              主5    主3
      /主3              主6    主3