【问题标题】:Query with multiple common table expressions not working?使用多个公用表表达式的查询不起作用?
【发布时间】:2016-01-29 05:29:26
【问题描述】:

如果我使用两个公用表表达式,一个是递归的,一个是简单的,它不起作用。如果两者都很简单,它就可以工作(它在 HSQL 中,并且 Postgres 语法有效)

不工作

WITH RECURSIVE TEMP_TABLE1(NAME) AS 
(
    SELECT child FROM FAMILY where parent='HUMAUN'
    UNION
    SELECT CHILD FROM FAMILY,TEMP_TABLE WHERE PARENT=TEMP_TABLE.NAME
),
TEMP_TABLE2 AS 
(
     SELECT CHILD FROM FAMILY
)
   SELECT CHILD FROM TEMP_TABLE1,TEMP_TABLE2 
   WHERE TEMP_TABLE1.NAME=TEMP_TABLE2.NAME 

如果我将 temp_table1 设为简单的非递归,则可以工作

WITH TEMP_TABLE1(NAME) AS 
(
    SELECT child FROM FAMILY where parent='HUMAUN'
    UNION
    SELECT CHILD FROM FAMILY WHERE PARENT='XYZ'
),
TEMP_TABLE2(NAME) AS 
(
     SELECT CHILD FROM FAMILY
)
   SELECT NAME FROM TEMP_TABLE1,TEMP_TABLE2 
   WHERE TEMP_TABLE1.NAME=TEMP_TABLE2.NAME 

【问题讨论】:

  • 如果我在最后单独运行这些 temp_tables 并带有一个 select 语句,它工作正常..所以它们都返回数据并且彼此独立..
  • "not working" 不是有效的 HSQLDB 错误消息,也不是可接受的问题描述。
  • @a_horse_with_no_name 意思是 Unexpected token 'AS' required '(' ,在这一行提到 'TEMP_TABLE2(NAME) AS' ,错误代码 -5581
  • 您使用的是哪个 HSQL 版本?
  • 您的“递归”cte 不是递归的;它从TEMP_TABLE 而不是TEMP_TABLE1 中选择

标签: sql database hsqldb common-table-expression


【解决方案1】:

编辑:这不是问题的解决方案。我不知道关键字RECURSIVE,我会把它留在这里以供后代使用。


我认为(但我不熟悉 hsqldb,只是 sql,虽然它适合您的错误消息)您的问题是您的递归 cte 的名称。你可以试试:

WITH RECURSIVE_TEMP_TABLE1(NAME) AS 
(
    SELECT child FROM FAMILY where parent='HUMAUN'
    UNION
    SELECT CHILD FROM FAMILY,RECURSIVE_TEMP_TABLE1 WHERE PARENT=TEMP_TABLE.NAME
)

注意 cte 名称中的额外下划线。另外,为了让它真正递归,union 的底部应该从自身中选择,所以RECURSIVE_TEMP_TABLE1

【讨论】:

  • HSQLDB 语法是 SQL 标准并且在 WITH 之后需要 RECURSIVE 关键字。其他一些数据库服务器不需要它。
  • @fredt,很公平,这并不能解决 OP 的问题。我认为可能是这种情况,但我在 hsqldb 中找不到递归 CTE 的参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多