すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CTE

最終更新日:Jun 05, 2024

このトピックでは、共通テーブル式 (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です。