Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL嵌套CTE和UNION_Sql_Postgresql_Union_Common Table Expression - Fatal编程技术网

PostgreSQL嵌套CTE和UNION

PostgreSQL嵌套CTE和UNION,sql,postgresql,union,common-table-expression,Sql,Postgresql,Union,Common Table Expression,我正在尝试使用PostgreSQL 9.1.3学习SQL。我想了解一些让我觉得不一致的行为。也就是说: 这项工作: WITH innermost AS (SELECT 2) SELECT * FROM innermost UNION SELECT 3; WITH outmost AS ( (WITH innermost AS (SELECT 2) SELECT * FROM innermost) )

我正在尝试使用PostgreSQL 9.1.3学习SQL。我想了解一些让我觉得不一致的行为。也就是说:

这项工作:

WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
WITH outmost AS (
        (WITH innermost AS (SELECT 2)
         SELECT * FROM innermost)
)                                
SELECT * FROM outmost;
我明白了:

 ?column? 
----------
        2
        3
 ?column? 
----------
        1
        2
这项工作:

WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
WITH outmost AS (
        (WITH innermost AS (SELECT 2)
         SELECT * FROM innermost)
)                                
SELECT * FROM outmost;
结果:

?column? 
----------
        2
ERROR:  relation "innermost" does not exist
LINE 4:          SELECT * FROM innermost
这也适用于:

WITH outmost AS (
  SELECT 1
  UNION (WITH innermost AS (SELECT 2)
         SELECT * FROM innermost)
)
SELECT * FROM outmost;
我明白了:

 ?column? 
----------
        2
        3
 ?column? 
----------
        1
        2
但这不起作用:

WITH outmost AS (
  SELECT 1
  UNION (WITH innermost as (SELECT 2)
         SELECT * FROM innermost
         UNION SELECT 3)
)
SELECT * FROM outmost;
结果:

?column? 
----------
        2
ERROR:  relation "innermost" does not exist
LINE 4:          SELECT * FROM innermost

在我看来,要么最后一个应该成功,要么另一个应该失败。我看不出模式。是否有一些一般规则可以让我预测嵌套CTE和联合的哪些组合将起作用或不起作用?

谜团已经解开:我观察到的行为是一个已知的bug。我向PostgreSQL特定列表发送了相同的原始帖子,得到了以下答案:

这是一个bug:-(.解析代码似乎认为 只能附着到顶层或叶级,请在中选择 设置操作树;但是语法遵循SQL标准 不说这样的话。WITH被接受,并附加到 中级联合,这是它在语法上应该去的地方, 然后在解析分析过程中完全忽略它 修好它

      regards, tom lane

虽然您的最终查询看起来很尴尬,但应该没问题,IMHO。这可能是解析器中的优先级/关联性错误。存在一些语义限制(没有嵌套的递归CTE,IIRC);可能解析器太挑剔,或者太容易触发。就我个人而言,我使用了很多嵌套CTE(最多4层),但我很少使用UNION,递归CTE除外。@AdamMackler你应该把它作为你自己问题的答案。Tom Lane承认你发现了一个bug,这有点像是你问了一个非常好的问题的官方批准。请将你从列表中得到的作为答案,并确保添加到该线程的链接。看起来像这样s已在9.2 beta3中修复。我引用时事通讯:
*修复集合操作(UNION/INTERSECT/EXCEPT)的问题
。我刚刚安装了9.2beta3,是的,我原来帖子中的非工作命令现在可以正常工作。谢谢你的提醒。酷!谢谢你跟踪此问题!你的问题值得更多的投票。:)顺便说一句,在这种情况下,我们鼓励您接受自己的(正确)答案。