Hierarchical Queryの簡単な例

Hierarchical Query(階層的クエリ)は、親と子など階層的データを持ったテーブルからデータを取り出す際に使用すると便利なクエリです。

(裏技的な用途として、何もないところから10000行並んだテーブルを取得したりできます。)

簡単な例を以下に記しました。

Hierarchical Queryの簡単な例
-- 今回のクエリで使うテーブルを定義します
WITH CONTAINS_HIERARCHICAL_DATA AS(
SELECT 1 id, null parent, 'ルート' name from dual
UNION ALL	SELECT 2 id, 1 parent, '子' name from dual
UNION ALL	SELECT 3 id, 2 parent, '孫' name from dual
UNION ALL	SELECT 4 id, 4 parent, '孫' name from dual
UNION ALL	SELECT 5 id, 2 parent, 'ひ孫' name from dual
UNION ALL	SELECT 6 id, 5 parent, 'ひひ孫' name from dual
UNION ALL	SELECT 7 id, 1 parent, '子' name from dual
UNION ALL	SELECT 8 id, null parent, 'ルート' name from dual
)

SELECT
-- LEVELというのはHierarchical Query上で使える擬似列です。
	LEVEL "階層の深さ",
	LPAD(' ', (LEVEL - 1) * 3, ' ') || ID || ':' || NAME "構造の図"
FROM
	CONTAINS_HIERARCHICAL_DATA

-- こっからHierarchical Queryのメイン部分
-- ルートとなる行の条件を指定します。
START WITH PARENT IS NULL AND ID = 1
-- PRIORは数少ない単項演算子です。
CONNECT BY PRIOR ID = PARENT -- (2008/10/26 -> 本来は親にPRIORつけるべき)

-- 兄弟(同じ階層にある行)の並び替えの順番指定です。
ORDER SIBLINGS BY ID DESC
クエリの結果
|階層の深さ|構造の図|
|1|1:ルート|
|2|   7:子|
|2|   2:子|
|3|      5:ひ孫|
|4|         6:ひひ孫|
|3|      3:孫|