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