Próbuję nauczyć się SQL, używając PostgreSQL 9.1.3. Chciałbym zrozumieć pewne zachowanie, które wydaje mi się niespójne. Słownie:PostgreSQL zagnieżdżone CTE i UNION
to działa:
WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
uzyskać to:
?column?
----------
2
3
to działa:
WITH outmost AS (
(WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Wynik:
?column?
----------
2
Działa to również:
WITH outmost AS (
SELECT 1
UNION (WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
uzyskać to:
?column?
----------
1
2
Ale to nie robi pracy:
WITH outmost AS (
SELECT 1
UNION (WITH innermost as (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3)
)
SELECT * FROM outmost;
Wynik:
ERROR: relation "innermost" does not exist
LINE 4: SELECT * FROM innermost
Moim zdaniem, albo ten ostatni powinien odnieść sukces, albo jeden z pozostałych powinien zawieść. Nie widzę wzoru. Czy istnieje jakaś ogólna zasada, która pozwoliłaby mi przewidzieć, które kombinacje zagnieżdżonych CTE i UNION-ów będą lub nie będą działać?
Choć twój ostateczny zapytanie wygląda niewygodne, powinno być OK, IMHO. Może to być błąd pierwszeństwa/asocjacji w analizatorze składni. Istnieją pewne ograniczenia semantyczne (Brak zagnieżdżonych rekurencyjnych CTE, IIRC); może parser jest zbyt wybredny lub zbyt szczęśliwy dla uruchomienia. Osobiście używam wielu zagnieżdżonych CTE (do 4 poziomów głębokości), ale rzadko używam UNION, z wyjątkiem rekurencyjnych CTE. – wildplasser
@AdamMackler należy umieścić jako odpowiedź na własne pytanie – araqnid
Tom Lane potwierdzając, że znalazłeś błąd, to coś w rodzaju oficjalnej zgody, że zadałeś bardzo dobre pytanie. Opublikuj, co dostałeś z listy jako odpowiedź, i dodaj link do wątku. –