共通テーブル式 (CTE) は、ステートメントの読みやすさと実行効率を向上させるために、SQL ステートメント内で複数回参照できる一時的な結果セットです。 WITHステートメントを適用して、共通テーブル式を使用できます。

あらすじ

With句:

WithClause
WITHWithListWITHrecursiveWithList

リストあり:

WithList
WithList,CommonTableExprCommonTableExpr

CommonTableExpr:

CommonTableExpr
IdentifierIdentListWithParenOptASSubSelect

IdentListWithParenOpt:

IdentListWithParenOpt
(IdentList)

非再帰 CTE:

WITH CTE AS (SELECT 1, 2) SELECT * FROM cte t1, cte t2;
+---+---+---+---+ | 1 | 2 | 1 | 2 | +---+---+---+---+ | 1 | 2 | 1 | 2 | +---+---+---+---+ 1 row in set (0.00 sec)

再帰的 CTE:

WITH RECURSIVE cte(a) AS (SELECT 1 UNION SELECT a+1 FROM cte WHERE a < 5) SELECT * FROM cte;
+---+ | a | +---+ | 1 | | 2 | | 3 | | 4 | | 5 | +---+ 5 rows in set (0.00 sec)

MySQL の互換性

  • 厳密モードでは、再帰的に計算されたデータ長がシード部分のデータ長を超えると、TiDB は警告を返しますが、MySQL はエラーを返します。非厳密モードでは、TiDB の動作は MySQL の動作と一致します。
  • 再帰 CTE のデータ型は、シード部分によって決まります。シード部分のデータ型は、MySQL と完全に一致しない場合があります (関数など)。
  • 複数のUNION / UNION ALL演算子の場合、MySQL はUNIONの後にUNION ALLが続くことを許可しませんが、TiDB は許可します。
  • CTE の定義に問題がある場合、TiDB はエラーを報告しますが、CTE が参照されていない場合、MySQL はエラーを報告しません。

こちらもご覧ください