数値シーケンス
CoddyのSQLジャーニー「応用」セクションの一部 — レッスン 20/27。
あなたは Fundamentals で、サブクエリに名前を付けるための WITH キーワード(CTE:共通テーブル式としても知られています)に出会いました。再帰的な CTE はさらに一歩進んでおり、サブクエリが自身を参照できるようにすることで、結果を 1 行ずつ構築していきます。
最も単純なバージョンは、基になるテーブルなしで一連の数値を生成します。その形式は常に同じです。
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を作成してください:
i:1から始まる反復インデックスp:2のi乗(2,4,8, …)
pが1000を超えたら停止してください。両方の列をiの昇順で返してください。
チートシート
再帰的CTEを使用すると、サブクエリが自身を参照できるようになり、結果を1行ずつ構築できます。
WITH RECURSIVE counter(n) AS (
SELECT 1 -- アンカー: 開始行
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- 再帰ステップ
)
SELECT n FROM counter- アンカー: シード行(最初の
SELECT) - 再帰ステップ: 次の行を生成するためにCTE自体をクエリします
WHERE条件が一致しなくなったときに停止します- これら2つの部分は
UNION ALLで結合されます
自分で試してみよう
WITH RECURSIVE powers(i, p) AS (
-- アンカー: i=1, p=2
-- 再帰: i+1, p*2、p が 1000 に達するまで
)
SELECT i, p FROM powers ORDER BY i
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。