27

我正在尝试使用 PostgreSQL 9.1.3 学习 SQL。我想了解一些让我觉得不一致的行为。以机智:

这有效:

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 和 UNION 的哪些组合将起作用或不起作用?

4

1 回答 1

26

谜团解开了:我观察到的行为是一个已知的错误。我将相同的原始帖子发送到特定于 PostgreSQL 的列表并得到了这个答案:

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

      regards, tom lane

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

于 2012-08-01T07:33:36.620 回答