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

10-83 階層の上下を取得

SQLパズル

hogeテーブル
ID  VAL   OYA
--  ---  ----
 1    A  null
 2    B     1
 3    C     2
 4    D     3
 5    E     4
 6    F     5
 7    G     6
 8    H     7
 9    I     8
23    J     2
24    K    23
25    L    24
26    M    25
27    N    26
28    O    27
29    P    28
34    Q     3
35    R    34
36    S    35
37    T    36
38    U    37
39    V    38

IDが3のレコードを基準として、
階層の上下を取得する

出力結果
上下      部分木
--------  ------
基準の上   BA
基準の下   DEFGHI
基準の下   QRSTUV


データ作成スクリプト

create table hoge(
ID  number(2),
Val char(1),
OYA number(2));

insert into hoge values( 1,'A',null);
insert into hoge values( 2,'B', 1);
insert into hoge values( 3,'C', 2);
insert into hoge values( 4,'D', 3);
insert into hoge values( 5,'E', 4);
insert into hoge values( 6,'F', 5);
insert into hoge values( 7,'G', 6);
insert into hoge values( 8,'H', 7);
insert into hoge values( 9,'I', 8);
insert into hoge values(23,'J', 2);
insert into hoge values(24,'K',23);
insert into hoge values(25,'L',24);
insert into hoge values(26,'M',25);
insert into hoge values(27,'N',26);
insert into hoge values(28,'O',27);
insert into hoge values(29,'P',28);
insert into hoge values(34,'Q', 3);
insert into hoge values(35,'R',34);
insert into hoge values(36,'S',35);
insert into hoge values(37,'T',36);
insert into hoge values(38,'U',37);
insert into hoge values(39,'V',38);
commit;


SQL

col 部分木 for a10

select case when Connect_by_Root OYA = 3 then '基準の下' else '基準の上' end as 上下,
replace(sys_connect_by_path(Val,','),',') as 部分木
  from hoge
 where Connect_by_IsLeaf = 1
 start with OYA = 3 or ID = (select b.OYA from hoge b
                              where b.ID =3)
 connect by Connect_by_Root OYA = 3
        and prior ID = OYA
         or (Connect_by_Root ID = (select b.OYA from hoge b
                                    where b.ID =3)
             and prior OYA = ID);


解説

Connect_by_Rootで根の情報を取得して、
分岐させてます

unionを使ってもいいでしょう