このトピックでは、共通テーブル式 (CTE) の使用法と構文について説明します。
概要
CTEはステートメントを簡略化するために、単一のSQLステートメントのスコープ内に存在する名前付きの一時結果セット。 CTEは、WITHキーワードを使用して定義されます。 CTEは、次の2つのタイプに分類できます。
再帰的CTE: 再帰的CTEは、SELECTステートメントで自分自身を参照します。 再帰的なCTEを使用して、再帰的なクエリを実行できます。
非再帰CTE:非再帰CTEは、ステートメント内でそれ自体を参照しません。
構文
with_clause:
と [RECURSIVE]
cte_name [(col_name [, col_name] ...)] AS (サブクエリ)
[, cte_name [(col_name [, col_name] ...)] AS (サブクエリ)] ...
再帰性CTE
RECURSIVE cte (n) ASの(
セレクト1
UNION ALL
SELECT n + 1からcte n < 5
)
SELECT * からcte;
非再帰CTE
WITH
cte1 AS (SELECT a, b FROM table1) 、
cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
どこcte1.a = cte2.c;
制約条件
CTEの再帰部分には、集計関数、ウィンドウ関数を含めることはできませんおよび次の句: GROUP BY、ORDER BY、およびDISTINCT。
CTEの再帰部分では、CTEはFROM句でのみ参照でき、サブクエリでは参照できません。 CTEは、それ自体で一度だけ参照することができる。
では、CTEの再帰的な部分では、CTEはLEFT JOIN句の正しいテーブルとして使用できません。
使用上の注意
再帰CTEはwith recursiveキーワードで始まる必要があります。 それ以外の場合、次のエラーが返されます。
error 1146 (42S02): Table 'cte_name' doesn't exist
。WITH RECURSIVEを使用して、非再帰CTEを定義することもできます。 この場合、RECURSIVEキーワードは有効になりません。
再帰CTEには、次の例に示すように、UNION ALLまたはUNIONキーワードによって連結された2つの句が含まれます。
を返すSELECT ... -- 非再帰部分、初期行セットを返す ユニオン [すべて] SELECT ... -- 再帰部分、追加の行セット
最初の句は、CTEの
非再帰部分
とも呼ばれます。 この句は初期データを生成し、CTE自体を参照することはできません。 2番目の句は、CTEの再帰部分とも呼ばれます。 この句は追加の行を生成し、CTE自体を参照します。 CTEの再帰部分
が新しいデータを返すことができなくなるまで、クエリが繰り返し実行されます。再帰CTEによって返される日付のタイプは、CTEの
非再帰部分
によってnullableとして指定されます。各反復において、CTEの
再帰的部分
は、最後の反復によって生成されたデータのみを参照することができる。CTE内の変数の値は、各反復における変数の名前および位置に基づいて指定される。 次のCTEは例を提供します。
RECURSIVE cte AS付き( SELECT 1 AS n、1 AS p、-1 AS q UNION ALL SELECT n + 1, q * 2, p * 2 cteからn < 5 ) SELECT * からcte;
上記のCTEでは、n、p、およびq変数の値は、
非再帰部分
で設定された後、名前に基づいて再帰部分で指定されます。再帰部分
の句が実行された後、変数の値はプロジェクト内の位置に基づいて指定されます。 したがって、次の結果が返されます。+ ------ ------ ------- | n | p | q | + ----- ------ + ------- | 1 | 1 | -1 | | 2 | -2 | 2 | | 3 | 4 | -4 | | 4 | -8 | 8 | | 5 | 16 | -16 | + ----- + ------ + ------- +
CTEの再帰部分
のUNION句の後にLIMITキーワードを使用して、CTEが実行される時間を指定できます。
Parameters
cte_max_recursion_depthパラメーターは、再帰CTEの再帰部分の最大反復回数を指定します。 このパラメーターのデフォルト値は500です。