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

10-106 条件付き階層問い合わせ

SQLパズル

KAISOUテーブル
OYA  KO  FLG              A
---  --  ---            / \
A    B     0           B      C
A    C     0         /|\     \
B    D     1        D  E  F      G
B    E     0      /           / \
B    F     0     H            I    J
C    G     0
D    H     0
G    I     0
G    J     0

ルートを A として階層情報を出力する
ただし、フラグが1である親子関係 B-D より下の親子関係は出力しない。

出力結果
LEVEL  OYA  KO             A
-----  ---  --           / \
    1  A    B           B      C
    2  B    D         /|\     \
    2  B    E        D  E  F      G
    2  B    F                   / \
    1  A    C                  I    J
    2  C    G
    3  G    I
    3  G    J


データ作成スクリプト

create table KAISOU(
OYA char(1),
KO  char(1),
FLG number(1));

insert into KAISOU values('A','B',0);
insert into KAISOU values('A','C',0);
insert into KAISOU values('B','D',1);
insert into KAISOU values('B','E',0);
insert into KAISOU values('B','F',0);
insert into KAISOU values('C','G',0);
insert into KAISOU values('D','H',0);
insert into KAISOU values('G','I',0);
insert into KAISOU values('G','J',0);
commit;


SQL

select Level,OYA,KO
  from KAISOU
Start With OYA ='A'
connect by prior KO = OYA
       and prior flg != 1
order siblings by KO;


解説

flg != 1
を階層問い合わせの条件として使ってます。