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