階層問い合わせとは、データが階層構造になっている場合に、簡単に階層順にデータを取り出すSELECT文です。
階層問い合わせは、
START WITH ~ CONNECT BY を使用します。
具体的には以下のような書き方になります。
SELECT カラム名
FROM テーブル名
WHERE 検索条件
START WITH ルート行を検索する条件
CONNECT BY 親子関係を表わす条件
階層問い合わせでは、WHEREで条件が不要な場合は、WHERE句は省くことができます。
START WITH句では、階層のルート行を指定する条件を入れます。したがってSTART WITH句の条件によっては、ルートは複数指定できます。
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句