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

问题描述 投票:0回答:2

此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是什么意思?

mysql common-table-expression recursive-query
2个回答
2
投票

您可以通过两种方式编写此内容。在不声明列名和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;

1
投票

您可以以更抽象的方式查看WITH RECURSIVE cte_count (n)。您的递归查询始终需要WITH RECURSIVE,后跟一个名称(在您的情况下为cte_count)。

接下来是逗号分隔的列表,该列表定义了查询的属性数量以及列的相应名称(例如(n))。

第二个查询中的问题是您用"one" as 'one'引入了新列。

尝试只写"one"而不是"one" as 'one'(两次!)并将(n)改成(n, one)以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.