WITH
WithClause:
WithClause
WithList:
WithList ::=
WithList ',' CommonTableExpr
| CommonTableExpr
CommonTableExpr:
CommonTableExpr
IdentListWithParenOpt
IdentListWithParenOpt ::=
( '(' IdentList ')' )?
非递归的 CTE:
+---+---+---+---+
+---+---+---+---+
| 1 | 2 | 1 | 2 |
+---+---+---+---+
1 row in set (0.00 sec)
递归的 CTE:
+---+
| a |
| 1 |
| 2 |
| 3 |
| 5 |
+---+
- 在严格模式下,当递归部分算出的数据长度超过初始部分的数据长度时,TiDB 会返回警告,而 MySQL 会返回错误。在非严格模式下,TiDB 与 MySQL 行为一致。
- 递归 CTE 所使用的数据类型由初始部分决定。初始部分的数据类型在某些情况(例如函数)下与 MySQL 并不完全一致。
- 多个 UNION / UNION ALL 情况下,MySQL 不允许 UNION 后面加 UNION ALL,TiDB 允许。
- 如果 CTE 的定义存在问题,TiDB 会报错,而 MySQL 在未引用的情况下不报错。