此MySQL 8查询:
WITH RECURSIVE cte_count (n)
AS (
SELECT 1
UNION ALL
SELECT
n + 1
FROM cte_count
WHERE n < 3
)
SELECT *
FROM cte_count;
产品:
+------+
| n |
+------+
| 1 |
| 2 |
| 3 |
+------+
但是这个:
WITH RECURSIVE cte_count (n)
AS (
SELECT 1
,"one" as `one`
UNION ALL
SELECT
n + 1
,"one" as `one`
FROM cte_count
WHERE n < 3
)
SELECT *
FROM cte_count;
产生错误:
错误代码:1054。“字段列表”中的未知列“ n”
您能解释为什么以及如何解决该错误吗?
(n)
之后的WITH RECURSIVE cte_count
是什么意思?
您可以通过两种方式编写此内容。在不声明列名和CTE名称的情况下:
WITH RECURSIVE cte_count
AS (
SELECT 1 as n
,'one' as `one`
UNION ALL
SELECT
n + 1
,'one'
FROM cte_count
WHERE n < 3
)
SELECT *
FROM cte_count;
并且声明它们而无需在查询的正文中使用别名:
WITH RECURSIVE cte_count (n, `one`)
AS (
SELECT 1
,'one'
UNION ALL
SELECT
n + 1
,'one'
FROM cte_count
WHERE n < 3
)
SELECT *
FROM cte_count;
您可以以更抽象的方式查看WITH RECURSIVE cte_count (n)
。您的递归查询始终需要WITH RECURSIVE
,后跟一个名称(在您的情况下为cte_count
)。
接下来是逗号分隔的列表,该列表定义了查询的属性数量以及列的相应名称(例如(n)
)。
第二个查询中的问题是您用"one" as 'one'
引入了新列。
尝试只写"one"
而不是"one" as 'one'
(两次!)并将(n)
改成(n, one)
以解决您的问题。