トップページに戻る
次の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 not null 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);
commit;
SQL
with 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;
解説