階層問い合わせ

メモ:  Category:oracle

ストラクチャー型の部品表(構成マスタ)やツリー状のメニューなどで使えそうな、階層問い合わせについてまとめます。

階層問い合わせとは

次のようなツリー構造があるとします。

ツリー構造のイメージ

このツリーの関係をデータベースで表すと次のようなテーブルが用意できます。

ツリー構造のテーブル

このテーブルから「A」を頂点(根)として親子関係を紐解くには、次のSQL文を実行します。

SELECT parents,children 
FROM TREE_NODE
START WITH parents = 'A'
CONNECT BY PRIOR children = parents;

階層問い合わせでは、最初に START WITH 句で木の根となる条件が判定されます。

次に CONNECT BY 句で、ノード同士の親子条件が判定されます。 PRIOR 演算子は、親の行の値であることを示しており PRIOR children = parents で、(親の行の) children = (子の行の)parents という条件になります。

CONNECT BY 句の指定で、根(親)からの子、孫へと検索が行われ枝葉が展開されます。

CONNECT BY 句
parents      children
----------   -----------
A            B
B            E
B            F
A            C
C            E
C            G
A            D

Level 擬似列

結果として取得できていますが少しわかりにくいので、 Level 擬似列というものを使ってみます。Level 擬似列は、 START WITH 句の条件を満たしたノードのレベルを1として、子供をレベル2、孫をレベル3といった感じで深さを表現してくれます。

SELECT parents,children,Level 
FROM TREE_NODE
START WITH parents = 'A'
CONNECT BY PRIOR children = parents;
parents      children      Level
----------   -----------   -----------
A            B             1
B            E             2
B            F             2
A            C             1
C            E             2
C            G             2
A            D             1

子・孫から親へ逆展開

CONNECT BY 句を使用すると、枝葉から根へ遡ることも可能となります。

SELECT parents,children,Level 
FROM TREE_NODE
START WITH children = 'E'
CONNECT BY PRIOR parents = children;
parents      children      Level
----------   -----------   -----------
B            E             1
C            E             1
A            B             2
A            C             2

bluenote by BBB