トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
7-35 siblingsオプション
SQLパズル
親子テーブル
親 子
-- --
a1 h1
h1 z1
h1 z2
h1 z3
d1 x1
x1 f1
x1 f2
x1 f3
親子テーブルの階層情報を、子の昇順に出力する(ただし階層は崩さない)
出力結果
親 子 Level
-- -- -----
a1 h1 1
h1 z1 2
h1 z2 2
h1 z3 2
d1 x1 1
x1 f1 2
x1 f2 2
x1 f3 2
データ作成スクリプト
create table 親子(
親 char(2),
子 char(2));
insert into 親子 values('a1','h1');
insert into 親子 values('h1','z1');
insert into 親子 values('h1','z2');
insert into 親子 values('h1','z3');
insert into 親子 values('d1','x1');
insert into 親子 values('x1','f1');
insert into 親子 values('x1','f2');
insert into 親子 values('x1','f3');
commit;
SQL
select 親,子,Level
from 親子 a
start with not exists(select 1 from 親子 b
where b.子 = a.親)
connect by prior 子 = 親
order siblings by 子;
解説
siblingsオプションを指定すると階層を崩さずにソートできます。
マニュアルより引用
階層問合せでは、ORDER BYまたはGROUP BYを指定しないでください。
指定すると、CONNECT BYの結果の階層順序が壊れます。
同じ親の兄弟である行を順序付ける場合は、ORDER SIBLINGS BY句を使用します。
Oracleの階層問い合わせ2 (Level,sys_connect_by_path)