WITH

    WithClause:

    WithClause

    WithList:

    WITH - 图2

    1. WithList ::=
    2. WithList ',' CommonTableExpr
    3. | CommonTableExpr

    CommonTableExpr:

    CommonTableExpr

    IdentListWithParenOpt

    WITH - 图4

    1. IdentListWithParenOpt ::=
    2. ( '(' IdentList ')' )?

    非递归的 CTE:

    1. +---+---+---+---+
    2. +---+---+---+---+
    3. | 1 | 2 | 1 | 2 |
    4. +---+---+---+---+
    5. 1 row in set (0.00 sec)

    递归的 CTE:

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