Sto cercando di imparare SQL, utilizzando PostgreSQL 9.1.3. Mi piacerebbe capire un comportamento che mi sembra inconsistente. Vale a dire:PostgreSQL nested CTE e UNION
Questo funziona:
WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
ottengo questo:
?column?
----------
2
3
Questo funziona:
WITH outmost AS (
(WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Risultato:
?column?
----------
2
Questo funziona anche:
WITH outmost AS (
SELECT 1
UNION (WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
ottengo questo:
?column?
----------
1
2
Ma questo non non lavoro:
WITH outmost AS (
SELECT 1
UNION (WITH innermost as (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3)
)
SELECT * FROM outmost;
Risultato:
ERROR: relation "innermost" does not exist
LINE 4: SELECT * FROM innermost
Per il mio modo di pensare, o l'ultimo dovrebbe avere successo o uno degli altri dovrebbe fallire. Non vedo lo schema. C'è qualche regola generale che mi consenta di prevedere quali combinazioni di CTE e UNION annidate funzioneranno o meno?
Anche se la query finale sembra scomoda, dovrebbe essere ok, IMHO. Potrebbe essere un errore di precedenza/associatività nel parser. Esistono alcune restrizioni semantiche (nessuna CTE ricorsiva annidata, IIRC); forse il parser è troppo schizzinoso, o troppo felice. Personalmente, uso un sacco di CTE annidate (fino a 4 livelli di profondità), ma uso raramente UNION, tranne che nelle CTE ricorsive. – wildplasser
@AdamMackler dovresti metterlo come risposta alla tua stessa domanda – araqnid
Tom Lane riconoscendo che hai trovato un bug, è qualcosa come un'approvazione ufficiale che hai posto una buona domanda. Per favore pubblica ciò che hai ricevuto dalla lista come risposta e assicurati di aggiungere un collegamento alla discussione. –