Estoy tratando de aprender SQL, usando PostgreSQL 9.1.3. Me gustaría entender algún comportamiento que me parece inconsistente. A saber:PostgreSQL anidado CTE y UNION
Esto funciona:
WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
me sale 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;
me sale esto:
?column?
----------
1
2
Pero esto no trabajo:
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
Según mi modo de pensar, el último debería tener éxito o uno de los otros debería fallar. No veo el patrón. ¿Hay alguna regla general que me permita predecir qué combinaciones de CTE anidados y UNION funcionarán o no?
Aunque su consulta final se ve incómodo, debería estar bien, en mi humilde opinión. Podría ser un error de precedencia/asociatividad en el analizador. Hay algunas restricciones semánticas (sin CTE recursivos anidados, IIRC); tal vez el analizador es demasiado quisquilloso, o demasiado gatillo feliz. Personalmente, utilizo muchos CTE anidados (hasta 4 niveles de profundidad), pero rara vez uso UNION, excepto en los CTE recursivos. – wildplasser
@AdamMackler debe poner eso como la respuesta a su propia pregunta – araqnid
Tom Lane reconociendo que encontró un error, es algo así como una aprobación oficial que hizo una muy buena pregunta. Por favor, publique lo que obtuvo de la lista como respuesta y asegúrese de agregar un enlace al hilo. –