数値シーケンス
CoddyのSQLジャーニー「応用」セクションの一部 — レッスン 20/27。
Fundamentals で、サブクエリ(CTE: Common Table Expression とも呼ばれます)に名前を付けるための WITH キーワードについて学びました。recursive CTE はさらに一歩進んで、サブクエリが自分自身を参照できるようにし、結果を row ごとに構築していきます。
最も簡単なバージョンは、基になるテーブルなしで一連の数値を生成します。その構造は常に同じです。
WITH RECURSIVE counter(n) AS (
SELECT 1 -- アンカー: 開始行
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- 再帰: 最後のものから次を構築
)
SELECT n FROM counter次のように読み解きます:n = 1 から開始し、各 n が前の n + 1 となる行を追加し続け、WHERE の条件に一致しなくなった時点で停止します。結果は 1, 2, 3, 4, 5 となります。
本体の2つの部分は UNION ALL によって結合されます。1つ目はanchor(シード行)です。2つ目はrecursive step(再帰ステップ)であり、CTE自体をクエリします。
チャレンジ
簡単2つの列を持つ powers という名前の再帰CTE(recursive CTE)を作成してください:
i:1から始まる反復インデックスp:2のi乗(2,4,8, …)
p が 1000 を超える手前で停止してください。i の昇順でソートして両方の列を返します。
自分で試してみよう
WITH RECURSIVE powers(i, p) AS (
-- アンカー: i=1, p=2
-- 再帰: i+1, p*2, pが1000に達するまで
)
SELECT i, p FROM powers ORDER BY i
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。