【问题标题】:H2 recursive call not recognizing columnH2递归调用不识别列
【发布时间】:2019-10-12 13:40:31
【问题描述】:

我有下面的代码,数据库说它看不到列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)

【问题讨论】:

  • 此查询在 Postgres 中运行良好:db fiddle
  • 嗯..我添加了它给出的错误。

标签: h2 common-table-expression recursive-query


【解决方案1】:

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;

【讨论】:

  • 我的例子是简化。我实际上有一个需要递归覆盖的真实表格。不过谢谢,解决了。我刚刚将所有列名添加到递归调用中。 :D
猜你喜欢
  • 2013-07-23
  • 2014-02-04
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2014-08-31
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多