階層構造をたどる
CoddyのSQLジャーニー「応用」セクションの一部 — レッスン 21/27。
再帰的CTEが存在する本当の理由:それは、単一のテーブルに格納された親子関係をたどることです。employees テーブルに、同じテーブル内を指す manager_id カラムがあると仮定します。
WITH RECURSIVE chain AS (
SELECT id, name, manager_id
FROM employees WHERE id = 7 -- アンカー:開始点となる従業員
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN chain c ON e.id = c.manager_id -- 再帰:マネージャーへ移動
)
SELECT * FROM chain各ステップでCTEをemployeesに結合し直し、ツリーを1レベル上に移動します。行にマネージャーがいない場合(JOINが何にも一致しない場合)、再帰は自然に停止します。
チャレンジ
中級利用可能なテーブルとカラム:
<strong>categories</strong>:<strong>id</strong>,<strong>name</strong>,<strong>parent_id</strong>
各カテゴリには、別のカテゴリを指すオプションの parent_id があります。カテゴリ id = 1 の子孫(子、孫、…)であるすべてのカテゴリを返してください。ただし、カテゴリ 1 自体は含めないでください。id と name を返し、id 順に並べてください。
チートシート
単一のテーブルに保存されている親子関係(例:同じテーブルを指し示す manager_id や parent_id カラム)をたどるには、再帰的CTEを使用します:
WITH RECURSIVE chain AS (
SELECT id, name, manager_id
FROM employees WHERE id = 7 -- アンカー:開始行
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN chain c ON e.id = c.manager_id -- 再帰:親へ移動
)
SELECT * FROM chainJOIN が一致する行を見つけられなくなったとき(例:マネージャーがいない行)、再帰は自然に停止します。
自分で試してみよう
WITH RECURSIVE descendants AS (
-- anchor: id 1 の直接の子
-- recursive: それらの子、など
)
SELECT id, name FROM descendants ORDER BY id
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。