A Day In The Life

とあるプログラマの備忘録

階層問い合わせ

テーブルにIDと親IDを持ち階層構造をあらわすテーブルがあるとき、階層で表示されると便利です。



Oracleではconnect by句を使ってデータの階層表示ができます。

select
lpad(' ',2*(level)) || name name
from
emp
start with parent_id is null
connect by prior id = parent_id

といった感じです。

start withで一番上の階層を指定して、connect byで親子関係を指定します。

これだけだとデータが親子関係で整列されるだけなので、

select文で階層表示するようにしてやります。

lpad(' ',2*(level))で階層がひとつ下がるごとに空白を2ついれて階層表示してやります。

表示されるイメージは

社長 島耕作
 専務 島耕作
  部長 島耕作
   課長 島耕作
    平社員 島耕作
    平社員 田中
  部長 山田新作
   課長 山田新作
    平社員 中村

とこんな感じです。