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

再帰with句01 OracleのLevel擬似列を模倣

SQLパズル

IDTable
ID  OyaID
--  -----
 1   null
 2      1
 3      2
 4      3
 5      1
 6      5
 7      2
20   null
21     20
22     21

Oracleの下記のクエリと同じ結果を取得する。

select ID,OyaID,Level
  from IDTable
start with OyaID is null
connect by prior ID = OyaID;

出力結果
ID  OyaID  Level
--  -----  -----
 1   null      1
 2      1      2
 3      2      3
 4      3      4
 7      2      3
 5      1      2
 6      5      3
20   null      1
21     20      2
22     21      3


データ作成スクリプト

create table IDTable(
ID    integer primary key,
OyaID integer);

insert into IDTable values
( 1,null),
( 2,   1),
( 3,   2),
( 4,   3),
( 5,   1),
( 6,   5),
( 7,   2),
(20,null),
(21,  20),
(22,  21);


SQL

with RECURSIVE X(ID,OyaID,Level) as(
select ID,OyaID,1
  from IDTable
 where OyaID is null
union all
select b.ID,b.OyaID,Level+1
  from X,IDTable b
 where X.ID = b.OyaID)
select * from X;


解説

再帰with句では、Join構文で結合できるようですが、
旧式の結合構文のほうが無難かもしれません。

Port CONNECT BY to DB2(英語)