首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PostgreSQL嵌套CTE和UNION

PostgreSQL嵌套CTE和UNION
EN

Stack Overflow用户
提问于 2012-07-31 21:30:17
回答 1查看 6.8K关注 0票数 26

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

这是可行的:

WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;

我明白了:

 ?column? 
----------
        2
        3

这是可行的:

WITH outmost AS (
        (WITH innermost AS (SELECT 2)
         SELECT * FROM innermost)
)                                
SELECT * FROM outmost;

结果:

?column? 
----------
        2

这也是可行的:

WITH outmost AS (
  SELECT 1
  UNION (WITH innermost AS (SELECT 2)
         SELECT * FROM innermost)
)
SELECT * FROM outmost;

我明白了:

 ?column? 
----------
        1
        2

但这不是的工作方式:

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

结果:

ERROR:  relation "innermost" does not exist
LINE 4:          SELECT * FROM innermost

在我看来,不是最后一个成功,就是另一个失败。我看不出有什么规律。有没有一些通用规则可以让我预测嵌套CTE和联合的哪些组合可以或不能工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-01 15:33:37

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

这是一个错误:-(。解析分析代码似乎认为WITH只能附加到集合操作树中的顶层或叶级SELECT;但是语法遵循SQL标准,它没有说明这一点。WITH被接受,并附加到中间级别的UNION,这是它在语法上应该去的地方,然后在解析分析过程中完全忽略它。将会考虑如何修复它。

你好,汤姆雷恩

http://archives.postgresql.org/pgsql-novice/2012-07/msg00113.php

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11741267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档