MySQL 8 Код ошибки рекурсивного CTE: 1054. Неизвестный столбец - PullRequest
0 голосов
/ 26 октября 2019

Этот запрос 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?

Ответы [ 2 ]

3 голосов
/ 26 октября 2019

Это можно написать двумя способами. Без объявления имен столбцов вместе с именем 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 голосов
/ 26 октября 2019

Вы можете посмотреть на WITH RECURSIVE cte_count (n) более абстрактно. Вам всегда нужно WITH RECURSIVE для вашего рекурсивного запроса, за которым следует имя (в вашем случае cte_count).

Далее следует список через запятую, который также определяет количество атрибутов для вашего запроса. как соответствующие имена для ваших столбцов (например, (n)).

Проблема во втором запросе состоит в том, что вы ввели новый столбец с "one" as 'one'.

Попробуйте написать только "one" вместо "one" as 'one' (оба раза!) и сделайте от (n) до (n, one), чтобы решить вашу проблему.

...