階層をたどる
CoddyのSQLジャーニー「応用」セクションの一部。レッスン 21/27。
再帰的 CTE が存在する本当の理由は、1 つのテーブルに格納された parent/child 関係をたどることです。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レベル上へ移動します。行にmanagerがない場合(JOINが何にも一致しない場合)、再帰は自然に停止します。
チャレンジ
中級利用可能なテーブルと列:
categories:id、name、parent_id
各カテゴリには、別のカテゴリを指すオプションの parent_id があります。カテゴリ id = 1 の子孫(子、孫、…)であるすべてのカテゴリを返しますが、カテゴリ 1 自体は除外します。id と name を返し、id の順に並べます。
自分で試してみよう
WITH RECURSIVE descendants AS (
-- anchor: id 1 の直接の子
-- recursive: それらの子など
)
SELECT id, name FROM descendants ORDER BY id
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
応用のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド