トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

7-46 階層の子と子孫の数を取得

SQLパズル

社員テーブル
社員ID     役職  上司
------  -------  ----
     1  部長A    null
    11  課長A       1
    21  係長A      11
    31  平社員A    21
    12  課長B       1
    22  係長B      12
    32  平社員B    22

社員テーブルから以下の出力を行う。

出力結果
階層レベル  社員ID      役職    上司   部下数  直属部下数
----------  ------  --------  -----   -----  ----------
         1       1    部長A    null       6           2
         2      11    課長A       1       2           1
         3      21    係長A      11       1           1
         4      31  平社員A      21       0           0
         2      12    課長B       1       2           1
         3      22    係長B      12       1           1
         4      32  平社員B      22       0           0


データ作成スクリプト

create table 社員(
社員ID number(2),
役職   varchar2(7),
上司   number(2));

insert into 社員 values( 1,'部長A'  ,null);
insert into 社員 values(11,'課長A'  ,   1);
insert into 社員 values(21,'係長A'  ,  11);
insert into 社員 values(31,'平社員A',  21);
insert into 社員 values(12,'課長B'  ,   1);
insert into 社員 values(22,'係長B'  ,  12);
insert into 社員 values(32,'平社員B',  22);
commit;


SQL

select Level as 階層レベル,
社員ID,役職,上司,
(select count(*) from 社員 b where Level >= 2
 start with b.RowID=a.RowID
 connect by prior 社員ID = 上司) as 部下数,
(select count(*) from 社員 b
  where b.上司=a.社員ID) as 直属部下数
from 社員 a
start with 社員ID = 1
connect by PRIOR 社員ID = 上司;


解説

RowIDをstart withの条件として、
階層問い合わせをして、階層の子孫の数を取得してます。