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