Menu
Coddy logo textTech

階層構造をたどる

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が何にも一致しない場合)、再帰は自然に停止します。

challenge icon

チャレンジ

中級

利用可能なテーブルとカラム:

  • <strong>categories</strong>: <strong>id</strong>, <strong>name</strong>, <strong>parent_id</strong>

各カテゴリには、別のカテゴリを指すオプションの parent_id があります。カテゴリ id = 1 の子孫(子、孫、…)であるすべてのカテゴリを返してください。ただし、カテゴリ 1 自体は含めないでください。idname を返し、id 順に並べてください。

チートシート

単一のテーブルに保存されている親子関係(例:同じテーブルを指し示す manager_idparent_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 chain

JOIN が一致する行を見つけられなくなったとき(例:マネージャーがいない行)、再帰は自然に停止します。

自分で試してみよう

WITH RECURSIVE descendants AS (
    -- anchor: id 1 の直接の子
    -- recursive: それらの子、など
)
SELECT id, name FROM descendants ORDER BY id
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

応用のすべてのレッスン