MySQL8 递归 CTE 错误代码:1054。未知列

MySQL 8 Recursive CTE Error Code: 1054. Unknown column

本MySQL8条查询:

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;

产生错误:

Error Code: 1054. Unknown column 'n' in 'field list'

您能解释一下错误的原因以及解决方法吗?

WITH RECURSIVE cte_count后面的(n)是什么意思?

有两种写法。
没有在 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) 来解决你的问题。