0Pricing
SQL Academy · レッスン

階層構造向け再帰CTE

WITH RECURSIVEと停止条件を使い、階層データ(組織図、スレッド形式のコメント、グラフ探索)をたどります。

「階層構造向け再帰CTE」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

なぜ再帰なのか

通常のSQLでは、深さが分からないツリーをたどることはできません。たとえば、親の親や子の子をたどる操作です。再帰CTEが標準SQLでの解決策です。

構造

再帰CTEは、UNION ALLで結合された2つの部分から構成されます。

WITH RECURSIVE name AS (
  -- 1. Anchor query: seed rows
  SELECT ...
  UNION ALL
  -- 2. Recursive step: references the CTE itself
  SELECT ...
  FROM name JOIN ...
)
SELECT * FROM name;

組織図をたどる

指定したマネージャーに直接または間接的にレポートするすべての従業員を検索します。

WITH RECURSIVE reports AS (
  -- anchor: the manager themself
  SELECT id, full_name, manager_id, 0 AS depth
  FROM employees WHERE id = 42

  UNION ALL

  -- recurse: people whose manager is in reports
  SELECT e.id, e.full_name, e.manager_id, r.depth + 1
  FROM employees e
  JOIN reports r ON r.id = e.manager_id
)
SELECT * FROM reports ORDER BY depth, full_name;

スレッド形式のコメント

ルートからディスカッションツリーをたどります。

WITH RECURSIVE thread AS (
  SELECT id, parent_id, body, 0 AS depth, ARRAY[id] AS path
  FROM comments WHERE id = $1
  UNION ALL
  SELECT c.id, c.parent_id, c.body, t.depth + 1, t.path || c.id
  FROM comments c
  JOIN thread t ON c.parent_id = t.id
)
SELECT * FROM thread ORDER BY path;

終了条件

再帰ステップが新しい行を返さなくなると、再帰は停止します。

無限ループの回避

グラフに循環がある場合は、訪問済みのノードを追跡します。

WITH RECURSIVE walk AS (
  SELECT id, ARRAY[id] AS path FROM nodes WHERE id = $1
  UNION ALL
  SELECT e.target_id, w.path || e.target_id
  FROM edges e
  JOIN walk w ON e.source_id = w.id
  WHERE e.target_id <> ALL(w.path)
)
SELECT * FROM walk;

数値系列

再帰CTEでは、数値の系列も生成できます。

WITH RECURSIVE n(i) AS (
  VALUES (1)
  UNION ALL
  SELECT i + 1 FROM n WHERE i < 100
)
SELECT i, i*i AS square FROM n;

部品表

サブアセンブリを含め、製品をすべての構成部品に展開します。

WITH RECURSIVE bom AS (
  SELECT part_id, sub_part_id, qty FROM parts WHERE part_id = $1
  UNION ALL
  SELECT p.part_id, p.sub_part_id, p.qty * bom.qty
  FROM parts p
  JOIN bom ON bom.sub_part_id = p.part_id
)
SELECT sub_part_id, SUM(qty) AS total_qty FROM bom GROUP BY sub_part_id;

深さの制限

安全のため、再帰の深さに上限を設定します。

WITH RECURSIVE tree AS (
  SELECT id, parent_id, 0 AS depth FROM nodes WHERE id = $1
  UNION ALL
  SELECT n.id, n.parent_id, t.depth + 1
  FROM nodes n JOIN tree t ON n.parent_id = t.id
  WHERE t.depth < 10
)
SELECT * FROM tree;

UNIONとUNION ALL

通常はUNION ALLを選択します。UNIONは重複を除去するため、あるノードに複数の経路で到達できる場合に便利です。

パフォーマンス

再帰CTEは反復的に評価されます。各ステップの「ワーキングテーブル」は、前のステップで生成された行です。結合に使う列にインデックスを作成してください。

まとめ

再帰CTEは階層構造やグラフをたどります。

  • アンカー + UNION ALL + 再帰ステップ
  • 再帰ステップが行を返さなくなると停止します
  • パス配列を使って循環を解消します

理解度チェック

CTEを再帰CTEにするキーワードは何ですか。

よくある質問

「階層構造向け再帰CTE」レッスンは無料ですか?

はい。「階層構造向け再帰CTE」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「階層構造向け再帰CTE」で何を学びますか?

WITH RECURSIVEと停止条件を使い、階層データ(組織図、スレッド形式のコメント、グラフ探索)をたどります。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「階層構造向け再帰CTE」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スカラー、行、テーブルのサブクエリ
  2. 相関サブクエリと非相関サブクエリ
  3. 共通テーブル式(WITH)
  4. 階層構造向け再帰CTE
← SQL Academyに戻る