Usare la parola chiave WITH
volta in alto e se qualcuno di vostra Common Table Expressions (CTE) sono ricorsiva (RCTE) si deve aggiungere la parola chiave RECURSIVE
in alto anche, anche se non tutti CTE sono ricorsiva:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Quoting the manual:
Se RECURSIVE
è specificato, tutto o a SELECT
sottoquery a riferimento stesso per nome.
Bold enfasi miniera. E, ancora più penetranti:
Un altro effetto è che RECURSIVE
WITH
query non devono essere ordinati: una query può fare riferimento a un altro che è più avanti nella lista. (Tuttavia, riferimenti circolari, o di mutuo ricorsione, non sono attuate.) Senza RECURSIVE
, WITH
query possono unico riferimento di pari livello WITH
query che sono precedenti nella lista WITH
.
Bold enfasi il mio nuovo. Significa che l'ordine delle clausole WITH
è senza significato quando è stata utilizzata la parola chiave RECURSIVE
.
BTW, dal momento che cte1
e cte2
non si fa riferimento nel esterna SELECT
e sono semplici se stessi (senza effetti collaterali) comanda SELECT
, non sono mai eseguite (a meno che non si fa riferimento in cte3
).
fonte
2016-02-07 03:28:37
Il nome di un CTE è un _identificatore_. Gli identificatori non devono essere racchiusi tra virgolette singole 'WITH 'cte1'' non è valido (come sarebbe ad esempio' da foobar come' bla'') –