PostgreSQL вложенные CTE и UNION - программирование
Подтвердить что ты не робот

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 будут работать или не будут работать?

4b9b3361

Ответ 1

Тайна решена: поведение, которое я наблюдал, является известной ошибкой. Я отправил то же оригинальное сообщение в список, специфичный для PostgreSQL, и получил этот ответ:

Это ошибка:-(. Анализ кода анализа кажется, что С может быть присоединен только к верхнему уровню или SELECT на уровне листа в пределах установить дерево операций; но грамматика следует стандарту SQL, который говорит, что нет такой вещи. СН принимается и прикрепляется к UNION промежуточного уровня, где синтаксически он должен идти, и затем он полностью игнорируется во время анализа анализа. Увидимся фиксируя его.

      regards, tom lane

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