階層構造向け再帰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フィードバックを取得できます。ローカル設定は不要です。