with update statement queries postgres multiple sql postgresql union common-table-expression

update - PostgreSQL anidado CTE y UNION



with statement postgres (1)

Estoy tratando de aprender SQL, usando PostgreSQL 9.1.3. Me gustaría entender algunos comportamientos que me parecen inconsistentes. Esto es:

Esto funciona:

WITH innermost AS (SELECT 2) SELECT * FROM innermost UNION SELECT 3;

Entiendo esto:

?column? ---------- 2 3

Esto funciona:

WITH outmost AS ( (WITH innermost AS (SELECT 2) SELECT * FROM innermost) ) SELECT * FROM outmost;

Resultado:

?column? ---------- 2

Esto también funciona:

WITH outmost AS ( SELECT 1 UNION (WITH innermost AS (SELECT 2) SELECT * FROM innermost) ) SELECT * FROM outmost;

Entiendo esto:

?column? ---------- 1 2

Pero esto no funciona:

WITH outmost AS ( SELECT 1 UNION (WITH innermost as (SELECT 2) SELECT * FROM innermost UNION SELECT 3) ) SELECT * FROM outmost;

Resultado:

ERROR: relation "innermost" does not exist LINE 4: SELECT * FROM innermost

En mi forma de pensar, o la última debería tener éxito o la otra debería fallar. No veo el patrón. ¿Hay alguna regla general que me permita predecir qué combinaciones de CTE y UNION anidadas funcionarán o no?


El misterio está resuelto: el comportamiento que estaba observando es un error conocido. Envié la misma publicación original a una lista específica de PostgreSQL y obtuve esta respuesta:

Este es un error :-(. El código de análisis de análisis parece pensar que WITH solo se puede adjuntar al nivel superior o a un SELECT a nivel de hoja dentro de un conjunto de árbol de operaciones, pero la gramática sigue el estándar SQL que no dice nada. El WITH se acepta y se adjunta a la UNION de nivel intermedio, que es donde debe ir sintácticamente, y luego se ignora por completo durante el análisis de análisis.

regards, tom lane

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