いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

階層問い合わせ(start with connect by)

たまに、忘れるのでメモ。


oracleで階層構造を手繰るには、connect byを使用します。


たとえば、組織情報を下って表示する場合などが、当てはまります。


以下サンプル。

create table test_table(
     id int primary key
    ,name varchar(100) not null
    ,parent_id int
);

ってテーブルがあって、データが以下のようになっています。

insert into test_table values(1, '階層ルート', null);
insert into test_table values(2, '一階層-1', 1);
insert into test_table values(3, '一階層-2', 1);
insert into test_table values(4, '2階層-1', 2);
insert into test_table values(5, '2階層-2', 2);
insert into test_table values(6, '2階層-3', 3);
commit;


上記の状態で、以下のSQLを発行すると

select
     level
    ,t.name
    ,t.id
    ,t.parent_id
from
    test_table t
start with t.id = 2
connect by prior t.id = t.parent_id;

起点をidが2のデータとし、そこから下の階層にいるものを表示します。
逆に、上に遡っていく場合は、

connect by prior t.id = t.parent_id;

の部分を

connect by prior t.parent_id = t.id;

とします。