SQL共通テーブル式(CTE)— WITH句

SQLのCTE(WITH句)を使用した読みやすくモジュラーなクエリの作成方法。基本CTE、複数CTE、階層データ用の再帰CTE、パフォーマンスの注意点を解説します。

Advanced SQL

詳細な説明

共通テーブル式(CTE)

CTEは単一のSQL文内で参照できる名前付きの一時的な結果セットを作成します。CTEは複雑なクエリをより読みやすくモジュラーにします。

基本的なCTE

WITH high_earners AS (
  SELECT name, salary, department_id
  FROM employees
  WHERE salary > 80000
)
SELECT h.name, h.salary, d.name AS department
FROM high_earners h
JOIN departments d ON h.department_id = d.id;

複数のCTE

WITH dept_stats AS (
  SELECT department_id,
    AVG(salary) AS avg_salary,
    COUNT(*) AS headcount
  FROM employees
  GROUP BY department_id
),
top_depts AS (
  SELECT * FROM dept_stats WHERE avg_salary > 70000
)
SELECT d.name, td.avg_salary, td.headcount
FROM top_depts td
JOIN departments d ON td.department_id = d.id;

再帰CTE

再帰CTEはアンカー(基本ケース)と再帰メンバーの2つの部分があります。

WITH RECURSIVE org_chart AS (
  -- アンカー:トップレベルのマネージャー
  SELECT id, name, manager_id, 1 AS depth
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  -- 再帰:各人の直属の部下を見つける
  SELECT e.id, e.name, e.manager_id, oc.depth + 1
  FROM employees e
  JOIN org_chart oc ON e.manager_id = oc.id
)
SELECT * FROM org_chart ORDER BY depth, name;

再帰CTEのユースケース

  • 組織図 / 管理階層
  • 部品表(サブパーツを含む部品)
  • カテゴリツリー / ネストメニュー
  • グラフ走査

データベースサポート

データベース 基本CTE 再帰CTE
PostgreSQL あり(8.4+) あり(8.4+)
MySQL あり(8.0+) あり(8.0+)
SQLite あり(3.8.3+) あり(3.8.3+)
SQL Server あり(2005+) あり(2005+)

CTEとサブクエリの比較

CTEは名前が付いており、複数回参照でき、手続き的なコードのように上から下へ読めるため、深くネストされたサブクエリよりも一般的に好まれます。ただし、一部のデータベースではインラインサブクエリほど積極的にCTEを最適化しない場合があります。

ユースケース

深くネストされたサブクエリが必要になるような複雑なクエリを書いている場合、または組織図やカテゴリツリーなどの階層データを走査する必要がある場合。

試してみる — SQL Cheat Sheet

フルツールを開く