Вложенные CTE и UNION в PostgreSQL

Я пытаюсь изучить 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 и UNION будут работать, а какие нет?

20
задан Erwin Brandstetter 11 August 2012 в 23:51
поделиться