PostgreSQL вложенные CTE и UNION
Я пытаюсь изучить 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 будут работать или не будут работать?
Ответы
Ответ 1
Тайна решена: поведение, которое я наблюдал, является известной ошибкой. Я отправил то же оригинальное сообщение в список, специфичный для PostgreSQL, и получил этот ответ:
Это ошибка:-(. Анализ кода анализа кажется, что С может быть присоединен только к верхнему уровню или SELECT на уровне листа в пределах установить дерево операций; но грамматика следует стандарту SQL, который говорит, что нет такой вещи. СН принимается и прикрепляется к UNION промежуточного уровня, где синтаксически он должен идти, и затем он полностью игнорируется во время анализа анализа. Увидимся фиксируя его.
regards, tom lane
http://archives.postgresql.org/pgsql-novice/2012-07/msg00113.php