2016-02-07 53 views
14

È possibile combinare più CTE in interrogazione singola con arel? Sto cercando modo per ottenere risultato come questo:CTE multipla in singola interrogazione

WITH 'cte1' AS (
... 
), 
WITH RECURSIVE 'cte2' AS (
... 
), 
WITH 'cte3' AS (
... 
) 
SELECT ... FROM 'cte3' WHERE ... 

Come potete vedere, ho una CTE ricorsiva e due non ricorsivo.

+0

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'') –

risposta

25

Usare la parola chiave WITHvolta 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 RECURSIVEWITH 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).

9

Sì. Non si ripete lo WITH. Basta usare una virgola:

WITH cte1 AS (
... 
), 
    cte2 AS (
... 
), 
    cte3 AS (
... 
) 
SELECT ... FROM 'cte3' WHERE ... 

E: usare solo le virgolette singole per la stringa di data e costanti. Non usarli per gli alias di colonne. Non sono comunque ammessi per i nomi CTE.

+1

Ma se ho bisogno di un CTE ricorsivo con 2 non ricorsivo? – axvm