CTE multipla in singola query

È ansible combinare più CTE in una singola query con arel ? Sto cercando il modo di ottenere risultati come questo:

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

Come puoi vedere, ho un CTE ricorsivo e due non ricorsivi.

Utilizzare la parola chiave WITH una volta in alto e se una qualsiasi delle Common Table Expressions (CTE) è ricorsiva (rCTE) è necessario aggiungere anche la parola chiave RECURSIVE in alto, anche se non tutte le CTE sono ricorsive:

 WITH RECURSIVE cte1 AS (...) -- can still be non-recursive , cte2 AS (SELECT ... UNION ALL SELECT ...) -- recursive term , cte3 AS (...) SELECT ... FROM cte3 WHERE ... 

Citando il manuale:

Se è specificato RECURSIVE , consente a una sottoquery SELECT fare riferimento a se stessa per nome.

Grassetto enfasi mio. E, ancora più perspicace:

Un altro effetto di RECURSIVE è che le query WITH non devono essere ordinate : una query può fare riferimento a un’altra che è più avanti nell’elenco. (Tuttavia, i riferimenti circolari, o ricorsione reciproca, non sono implementati.) Senza RECURSIVE , le query WITH possono fare riferimento solo a RECURSIVE WITH query che sono precedenti nell’elenco WITH .

In grassetto enfatizza il mio. Significa che l’ordine delle clausole WITH significato quando è stata utilizzata la parola chiave RECURSIVE .

BTW, poiché cte1 e cte2 non sono referenziati nella SELECT esterna e sono semplici comandi SELECT stessi (nessun effetto collaterale), non vengono mai eseguiti (a meno che non si cte3 riferimento in cte3 ).

Sì. Non ripetere il WITH . Devi solo usare una virgola:

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

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