共通テーブル式
gpt-5.icon
共通テーブル式(CTE)とは
CTE(Common Table Expression) は、
SQL の中で一時的な結果セット(仮のテーブル)に名前を付けて再利用する仕組みです。
読みやすさ・再利用性・再帰的クエリの記述に役立ちます。
基本構文
code:sql
WITH cte_name AS (
SELECT ...
)
SELECT *
FROM cte_name;
複数定義もできます。
code:sql
WITH c1 AS (...),
c2 AS (...)
SELECT ...
FROM c1
JOIN c2 ...
何がうれしいのか(メリット)
1. SQL が読みやすくなる
サブクエリを WITH 句で外に出して名前を付けられるため、
ネストが浅くなり理解しやすくなります。
2. 同じ結果を複数回参照できる
同じサブクエリを繰り返して書く必要がなく、DRY 原則を守れる。
3. 再帰的クエリが書ける
階層構造(組織ツリー、ディレクトリ、祖先ノードなど)を処理する際に使用される。
4. 一時ビューとして動作
ビューのように動作するが、スコープはクエリ内限定。
使用例
例1: サブクエリを分離して読みやすくする
code:sql
WITH high_salary AS (
SELECT employee_id, name, salary
FROM employees
WHERE salary > 5000000
)
SELECT name, salary
FROM high_salary
ORDER BY salary DESC;
例3: 再帰 CTE(階層取得)
code:sql
WITH RECURSIVE hierarchy AS (
-- Anchor: 最上位のノード
SELECT id, parent_id, name, 1 AS level
FROM categories
WHERE parent_id IS NULL
UNION ALL
-- Recursive: 子を辿っていく
SELECT c.id, c.parent_id, c.name, h.level + 1
FROM categories c
JOIN hierarchy h ON c.parent_id = h.id
)
SELECT *
FROM hierarchy;
CTE とサブクエリ・ビューの比較
table:_
概念 説明
サブクエリ クエリ内に直接埋め込む。可読性が下がることも。
CTE 一時的な名前付き結果セット。読みやすく再利用可能。
ビュー 永続的に作成される仮想テーブル。再利用性が高いが、DBに定義が必要。
パフォーマンスについて
多くのDBでは CTE は最適化のバリア(optimization fence) として動作する場合があり、
サブクエリより性能が落ちるケースがある。
一方、PostgreSQL 12 以降はインライン展開される場合が多い。
パフォーマンス目的ではなく、主に「読みやすさ」「構造化」のために使うのが一般的。