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

8-36 リーフノード,ブランチノード,ルートノードを判断

SQLパズル

BusyoTable
ID  OyaID  Name
--  -----  ----------
 1  null   織田信長
 2  1      堀久太郎
 3  1      羽柴筑前
 4  3      竹中半兵衛
 5  3      福島正則
 6  1      明智日向
 7  6      斎藤利三
 8  6      溝尾庄兵衛

prior ID = OyaID
を条件として階層を作成した時の
ノードが、リーフノード,ブランチノード,ルートノードのどれかを判断する。

出力結果
NodeType  ID  OyaID  Name
--------  --  -----  ----------
Root       1  null   織田信長
Leaf       2  1      堀久太郎
Branch     3  1      羽柴筑前
Leaf       4  3      竹中半兵衛
Leaf       5  3      福島正則
Branch     6  1      明智日向
Leaf       7  6      斎藤利三
Leaf       8  6      溝尾庄兵衛

SQLクックブックのレシピ13.5を参考にさせていただきました


データ作成スクリプト

create table BusyoTable(ID,OyaID,Name) as
select 1,null,'織田信長'   from dual union
select 2,1   ,'堀久太郎'   from dual union
select 3,1   ,'羽柴筑前'   from dual union
select 4,3   ,'竹中半兵衛' from dual union
select 5,3   ,'福島正則'   from dual union
select 6,1   ,'明智日向'   from dual union
select 7,6   ,'斎藤利三'   from dual union
select 8,6   ,'溝尾庄兵衛' from dual;


SQL

col NodeType for a10

select case when Level = 1 then 'Root'
            when Connect_by_IsLeaf=1 then 'Leaf'
       else 'Branch' end as NodeType,
ID,OyaID,Name
  from BusyoTable
Start With OyaID is null
connect by prior ID = OyaID;


解説

全てのノードは、根か枝か葉のいずれかであるので、
判断しやすい、根と葉を最初に判断しています。

根でかつ葉でもあるようなノード(孤立しているノード)は、
case式の結果が、'Root'となりますね。