SQL設計・ウィンドウ関数・関係代数 重要度:★★出題: AM2・PM1・PM2
共通表式(WITH句 / CTE)と再帰クエリ(WITH RECURSIVE)
きょうつうひょうしきとさいきくえり / Common Table Expression (CTE) & Recursive Query
1つのSQL文のスコープ内で一時的な名前付き結果セット(導出表)を定義するWITH句と、自己参照によって階層・グラフ構造を反復探索するWITH RECURSIVE句。
3行速習ポイント
- 複雑な多段階の集計や中間結果を `WITH 一時表名 AS (SELECT ...)` として切り出すことで、SQLの可読性と再利用性を高める
- 同じ一時表を主クエリ内で複数回参照できるため、重複する副問合せの記述を排除できる
- `WITH RECURSIVE` では非再帰項(初期集合)と再帰項を `UNION ALL` で結び、部品表(BOM)の展開や組織階層の探索を1つのSQLで実行できる
図解
図WITH RECURSIVE(再帰共通表式)の実行ステップ
11. 非再帰項(初期集合)の評価
Anchor Member親コード IS NULL 等の条件でルート階層(第1階層)を取得
22. UNION ALL と再帰項の反復
Recursive Step直前の結果セットと元表を結合し、子階層を1段ずつ追加取得
33. 終了判定と主クエリ出力
Termination新たな子行が0件になった時点で反復を終了し全階層を返却
概要と本質
午後I・午後IIの長文SQL問題で非常によく使われる構文です。例えば「入庫集計と出庫集計をそれぞれWITH句で一時表として定義し、主クエリで結合して在庫推移を算出する」「組織階層を最上位から最下位まで再帰的にたどって部門別集計を行う」といった場面で登場します。
重要ポイント・コア概念
- 再帰クエリの構成:①非再帰項(ルート行を取得するSELECT文)+ `UNION ALL` + ②再帰項(直前の結果セットと元テーブルを結合して次の階層を取得するSELECT文)
- 無限ループ防止:データに循環(サイクル)が含まれる可能性がある場合は、探索深さの上限条件やCYCLE句を指定する
- ビュー(CREATE VIEW)とは異なりデータベースカタログに永続化されず、当該SQL文の実行中のみ有効
午後I・午後II記述試験での攻略ポイント
WITH句を使ったSQL穴埋め問題では、WITH句で定義された一時表の「列名リスト」と、主SELECT文での「結合キー(ON句)」および「集計粒度(GROUP BY句)」の対応関係を丁寧に追跡すれば確実に得点できます。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える