Common Table Expressions(CTE)とは何ですか?
Common Table Expression(CTE)は、一時的に存在し、より大きなクエリのコンテキスト内でのみ使用されるクエリの結果セットです。派生テーブルと同様に、CTEの結果は保存されず、クエリの期間中のみ存在します。この記事では、非再帰的なCTEに焦点を当てます。
CTEはどのように役立ちますか?
CTEは、データベースビューや派生テーブルなど、ユーザーが読みやすさと簡素化を向上させることで、複雑なクエリをより簡単に記述および維持できるようにします。この複雑さの軽減は、通常は複雑なクエリを単純なブロックに分解して使用し、必要に応じてクエリの書き換えに再利用することで実現されます。ユースケースの例は次のとおりです。
- 1回のクエリで派生テーブルを複数回参照する必要がある
- データベースにビューを作成する代わりの方法
- 複数のクエリコンポーネントにわたって同じ計算を複数回実行する
CTEを作成する方法
- 「WITH」を使用してCTEを開始します
- まもなく定義されるクエリの結果に名前を付けます
- 名前を割り当てたら、「AS」を続けます
- 列名を指定します(オプションの手順)
- 目的の結果セットを生成するためのクエリを定義します
- 複数のCTEが必要な場合は、後続の各式をコンマで開始し、手順2〜4を繰り返します。
- 後続のクエリで上記で定義されたCTEを参照します
WITH
expression_name_1 AS
(CTE query definition 1)
[, expression_name_X AS
(CTE query definition X)
, etc ]
SELECT expression_A, expression_B, ...
FROM expression_name_1
## CTEの例次のクエリは、ビジネス上の質問に答えます。「会社のマーケティング活動のキャンペーンあたりの平均月額費用はいくらですか?」これは、派生クエリ(以下に表示)を使用して実行できます。ただし、CTEを使用すると読みやすさが向上します
-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)
-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign
派生クエリの使用:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
-- this is where the derived query is used
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign
- Postgres
- 赤方偏移
- Oracle
- SQLServer