Колонка рекурсивного вызова H2 не распознает - PullRequest
0 голосов
/ 12 октября 2019

У меня есть код ниже, и база данных говорит, что он не может видеть столбец n. У меня та же проблема, когда я использую реальные таблицы базы данных. Но с реальной таблицей я даже не налагаю псевдоним на столбец.

WITH RECURSIVE counter AS (
  SELECT 1 as n

  UNION ALL

  SELECT n + 1 FROM counter WHERE n < 10
)
SELECT * from counter;

Дается следующая ошибка:

Error: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "N" not found; SQL statement:
WITH RECURSIVE counter AS (
    SELECT 1 as n
    UNION ALL
    SELECT n + 1 FROM counter WHERE n < 10
)
SELECT * from counter [42122-199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:451)

1 Ответ

0 голосов
/ 12 октября 2019

CTE являются экспериментальными в H2 и имеют различные проблемы. На самом деле они вам здесь не нужны. В H2 вы можете использовать

SELECT * FROM SYSTEM_RANGE(1, 10);

В PostgreSQL и H2 вы можете использовать специфичные для PosgtreSQL

SELECT * FROM GENERATE_SERIES(1, 10);

Если вам нужно изменить имя столбца на N, добавьте производноесписок столбцов T(N) после функции.

SELECT * FROM GENERATE_SERIES(1, 10) T(N);

Но если вы все еще хотите использовать CTE, добавьте имена столбцов в предложение WITH и при необходимости удалите псевдоним из константы, еслив этом случае не потребуется:

WITH RECURSIVE counter(n) AS (
  SELECT 1

  UNION ALL

  SELECT n + 1 FROM counter WHERE n < 10
)
SELECT * from counter;
...