Menu
Coddy logo textTech

数値シーケンス

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

challenge icon

チャレンジ

簡単

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

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

p1000 を超える手前で停止してください。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
quiz icon腕試し

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

応用のすべてのレッスン