【问题标题】:MySQL 8 Recursive CTE Error Code: 1054. Unknown columnMySQL 8 递归 CTE 错误代码:1054。未知列
【发布时间】:2019-10-26 15:35:20
【问题描述】:

这个 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


    【解决方案1】:

    您可以通过 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;
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-12
        • 2015-08-19
        • 2016-04-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多