Error number: 4114; Symbol: ER_CTE_RECURSIVE_NOT_UNION; SQLSTATE: HY000
Message: Recursive table reference in EXCEPT or INTERSECT operand is not allowed.
错误说明
Error number 4114 (ER_CTE_RECURSIVE_NOT_UNION) 是MySQL的一个常见错误,是由于使用了不同的递归查询时,使用的查询构造不是UNION类型引起的。通常,MySQL要求使用递归查询的用户在构造查询时,必须将多个select语句包含在一个UNION运算符中,以表示递归查询的所有可能形式。
常见案例
该错误一般是因为在查询语句中使用递归查询构造,但是查询构造没有使用UNION来合并操作。下面是一个常见的造成Error number 4114 (ER_CTE_RECURSIVE_NOT_UNION)错误的案例,它使用一种抑制UNION的查询构造:
WITH cte1 AS (
SELECT * FROM tab1
UNION
SELECT * FROM tab2
),
cte2 AS (
SELECT * FROM cte1 WHERE c1=5
)
SELECT * FROM cte2;
在这种情况下,cte1定义时不使用UNION,而是直接对两个表进行选择操作,这是MySQL无法接受的。
解决方法
要解决Error number 4114 (ER_CTE_RECURSIVE_NOT_UNION),可以以下面的方式更改cte1定义:
WITH cte1 AS (
SELECT * FROM tab1
UNION ALL
SELECT * FROM tab2
),
cte2 AS (
SELECT * FROM cte1 WHERE c1=5
)
SELECT * FROM cte2;
将UNION改为UNION ALL,就可以解决Error 4114 (ER_CTE_RECURSIVE_NOT_UNION)这个错误。另外,在使用递归查询构造时,应始终使用UNION运算符合并查询,以满足MySQL的要求。