コンテンツへスキップ
uencoder

読みやすい SQL のために CTE を使う

共通テーブル式(WITH 句)は名前付きの一時結果セットを作り、可読性を高め、再帰も可能にします。

  1. 1

    CTE は WITH name AS (SELECT ...) で定義され、テーブルのように参照できます。複数の CTE は WITH a AS (...), b AS (...) SELECT ... と書きます。CTE はクエリごとに 1 回だけ評価されます (複数回評価されうるサブクエリとは異なります)。再帰 CTE (WITH RECURSIVE) は自分自身を参照でき、階層クエリに使えます。

  2. 2
    SQL フォーマッター →

    CTE クエリを整形して、各名前付き結果セットを明確に把握します。良い整形は、WITH キーワード、カンマ区切りの CTE 名、メインクエリの位置を揃えます。これにより複雑なクエリが読みやすく、保守しやすくなります。

  3. 3

    SQL 整形ワークフローを使って、CTE クエリを整形・ドキュメント化します。各 CTE の目的を説明するコメント付きの整然とした SQL が得られ、クエリが自己文書化されます。

よくある質問

CTE は実体化されますか?
PostgreSQL 12 より前では、CTE は常に実体化されます (1 回計算して保存)。PostgreSQL 12 以降では、MATERIALIZED を指定しない限り、デフォルトでインライン化されます (サブクエリと同様)。SQL Server と MySQL では、CTE はインライン化されます。CTE が複数回参照される場合は実体化が有利で、オプティマイザーが述語をプッシュダウンできる場合はインライン化が有利です。
CTE はテンポラリテーブルの代わりになりますか?
1 つのクエリ内での使用なら、はい。CTE のほうがすっきりします。複数のステートメントで (同じデータを参照する複数のクエリで) 使うなら、テンポラリテーブルを使ってください。CTE は 1 つのステートメント内にしか存在しません。また、テンポラリテーブルにはインデックスを付けられますが、CTE には付けられません。

このタスクを解決するワークフロー

関連ツール