トップページ >  Oracle SQL >  階層問い合わせ
初版2007/02/08: 最終更新日2007/02/08
  階層問い合わせ
目次
階層問い合わせ
CONNECT BY句
LEVEL
階層問い合わせ
階層問い合わせとは、データが階層構造になっている場合に、簡単に階層順にデータを取り出すSELECT文です。
階層問い合わせは、 START WITH ~ CONNECT BY を使用します。
具体的には以下のような書き方になります。

SELECT     カラム名
FROM       テーブル名
WHERE      検索条件
START WITH ルート行を検索する条件
CONNECT BY 親子関係を表わす条件

階層問い合わせでは、WHEREで条件が不要な場合は、WHERE句は省くことができます。
START WITH句では、階層のルート行を指定する条件を入れます。したがってSTART WITH句の条件によっては、ルートは複数指定できます。

CONNECT BY句
CONNECT BY句では、親と子の関係を指定します。

CONNECT BY句
CONNECT BY句

例えば上図のようなPARTSというテーブルがあるとします。
このデータにCONNECT BY句を指定する場合、以下のようにします。

SELECT     OYA_PARTS , KO_PARTS
FROM       PARTS
START WITH OYA_PARTS = 'パソコン名' AND KO_PARTS = 'ハードディスク'
CONNECT BY OYA_PARTS = PRIOR KO_PARTS

まず、START WITH句でルート行を指定します。
次にCONNECT BY句で親と子の関係を指定します。
PRIORを指定したカラムがまずルート行を参照することを意味します。この場合、ルート行のKO_PARTSを参照しています。
逆にPRIORが指定されていないカラムは、ルート行のPRIOR指定されたカラムと結びつくカラムを参照することを意味します。
大変わかりにくいですが、ルート行のPRIOR指定したカラムとは「ハードディスク」で、それと結びつくカラムは3行目のOYA_PARTSが「ハードディスク」となっている行のことです。
この親子関係を順々に結びつけるため、階層問い合わせが実現できます。

階層問い合わせの結果は以下のようになります。

CONNECT BY句
CONNECT BY句

この結果は下図の「パソコンーハードディスクー特殊ネジ」という階層を表わしているデータです。

CONNECT BY句
CONNECT BY句

LEVEL
階層問い合わせで、その行がどのレベルであるかを保持している LEVEL という擬似列があります。
ルート行のレベルは 1となります。
ルート行の子にあたる行のレベルは2となります。このようにレベルが1,2,3・・・というように階層ごとに変わります。

このLEVEL擬似列を使用して表示する階層レベルを指定できます。