この Topic では、共通テーブル式 (CTE) について説明し、簡単な例を示します。
概要
CTE は、単一のクエリの期間中のみ存在する一時的な名前付き結果セットです。同じクエリ内で後から CTE を参照できるため、文を簡略化できます。現在、CTE は SELECT 文でのみサポートされています。CTE の標準構文は次のとおりです。
WITH expression_name[(column_name [,...])]
AS
(CTE_definition)
SQL_statement;作成する CTE の名前を指定します。SQL ステートメントでは、CTE を参照する名前を指定できます。
出力フィールドを括弧で囲んで指定し、複数の出力フィールドはカンマで区切ります。出力フィールドの数とデータの型が、CTE の AS 句で指定した出力フィールドの数とデータの型と同じであることを確認してください。この式で出力フィールドを指定しない場合、システムは AS 句で指定した出力フィールドを使用します。
次に、AS を使用して CTE のデータ出力句を定義します。CTE の最終的な出力データは、この句によって生成されます。
CTE を定義した後、SQL ステートメントで CTE を参照できます。
例
次の例は、CTE の使用方法を示しています。
WITH T_CTE (i1_cte,i2_cte) AS (SELECT i1,i2 FROM t1)
SELECT * FROM T_CTE上記の例は、メインの SELECT 文が CTE からの結果セットを直接出力する単純な CTE を示しています。
WITH T_CTE (i1_cte,i2_cte) AS (SELECT i1,i2 FROM t1)
SELECT * FROM t2 JOIN T_CTE ON t2.i1 = T_CTE.i1_cte AND t2.i2 = T_CTE.i2_cteJOIN 句で CTE を使用することもできます。
WITH T_CTE (i1_cte,i2_cte) AS (SELECT i1,i2 FROM t1)
SELECT * FROM t2 WHERE EXISTS (SELECT * FROM T_CTE WHERE t2.i1 = i1_cte AND t2.i2 = i2_cte)または、独自のクエリで使用することもできます。
よくある質問
パフォーマンス
CTE は一時的な結果セットを定義します。ただし、これは CTE が別のステップとして実行されることを意味するものではありません。代わりに、データベースは実行計画を作成するときに CTE 定義を展開します。このプロセスにより、CTE とメインクエリを一緒に最適化できます。その結果、実行計画は CTE を使用しない同等のクエリよりも複雑になることはなく、パフォーマンスは同じです。