たまに、忘れるのでメモ。
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;
とします。