我正在try 学习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和联合的哪些组合将起作用或不起作用?

推荐答案

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

这是一个bug:-(.解析代码似乎认为

      regards, tom lane

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

Postgresql相关问答推荐

如何使用Docker安装PostgreSQL扩展

Postgresql我必须创建一个索引还是已经有一个索引了?

Select 所有数组类型和维度

mosquito-go-auth with postgres authorization error

如何在生成的列的表达式中使用TIMESTAMP WITH时区列?

PostgreSQL存储过程中不存在游标

执行准备好的语句不返回数据

从单选插入到多个表

@符号在yacc中的函数中是什么意思

计算 PostgreSQL 中给定 GPS 坐标的日出和日落时间

SQLAlchemy 中使用什么类型存储字节字符串?

在psql中,为什么有些命令没有效果?

postgresql 分组和内部连接

从time without time zone和时区名称中获取time with time zone

Postgis 中 2 点之间的距离,单位为 4326 米

PostgreSQL 获取过go 12 小时的元素

按任意时间间隔计算行数的最佳方法

Android 的 JDBC 与 Web 服务

在布尔字段上添加索引

调用 getNextException 来查看原因:如何让 Hibernate / JPA 显示异常的数据库服务器消息