PostgreSQL嵌套CTE和UNION
我正在尝试使用PostgreSQL 9.1.3学习SQL。我想了解一些让我觉得不一致的行为。也就是说: 这项工作: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) )
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,是的,我原来帖子中的非工作命令现在可以正常工作。谢谢你的提醒。酷!谢谢你跟踪此问题!你的问题值得更多的投票。:)顺便说一句,在这种情况下,我们鼓励您接受自己的(正确)答案。