Menu
Coddy logo textTech

数値シーケンス

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自体をクエリします。

challenge icon

チャレンジ

簡単

2つの列を持つ、powersという名前の再帰的CTEを作成してください:

  • i: 1から始まる反復インデックス
  • p: 2i乗(2, 4, 8, …)

p1000を超えたら停止してください。両方の列を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
quiz icon腕試し

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

応用のすべてのレッスン