と
L
T
d
共通テーブル式(CTE)は、SQL文内で複数回参照できる一時的な結果セットであり、文の可読性と実行効率を向上させます。共通テーブル式を使用するには、 WITH
文を適用します。
概要
句:
- WithClause
WithClause ::=
"WITH" WithList
| "WITH" "RECURSIVE" WithList
リスト付き:
- WithList
WithList ::=
WithList ',' CommonTableExpr
| CommonTableExpr
共通テーブル式:
- CommonTableExpr
CommonTableExpr ::=
Identifier IdentListWithParenOpt "AS" SubSelect
親オプション付き識別子リスト:
- 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 はエラーを報告しますが、MySQL は CTE が参照されていない場合はエラーを報告しません。