重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

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

あらすじ

WithClause:

WithClause
WITHWithListWITHrecursiveWithList

WithList:

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の互換性

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

も参照してください