80

Sto semplificando una complicata istruzione select, quindi ho pensato di utilizzare espressioni di tabella comuni.Come posso avere più espressioni di tabella comuni in una singola istruzione SELECT?

Dichiarare un singolo cte funziona correttamente.

WITH cte1 AS (
    SELECT * from cdr.Location 
    ) 

select * from cte1 

È possibile dichiarare e utilizzare più di una cte nella stessa SELECT?

cioè questo SQL dà un errore

WITH cte1 as (
    SELECT * from cdr.Location 
) 

WITH cte2 as (
    SELECT * from cdr.Location 
) 

select * from cte1  
union  
select * from cte2 

l'errore è

Msg 156, Level 15, State 1, Line 7 
Incorrect syntax near the keyword 'WITH'. 
Msg 319, Level 15, State 1, Line 7 
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon. 

NB. Ho provato a mettere il punto e virgola in e ottenere questo errore

Msg 102, Level 15, State 1, Line 5 
Incorrect syntax near ';'. 
Msg 102, Level 15, State 1, Line 9 
Incorrect syntax near ';'. 

Probabilmente non rilevante, ma questo è in SQL 2008.

risposta

115

penso che dovrebbe essere qualcosa di simile:

WITH 
    cte1 as (SELECT * from cdr.Location), 
    cte2 as (SELECT * from cdr.Location) 
select * from cte1 union select * from cte2 

In sostanza, è WITH solo una clausola qui, e come le altre clausole che prendono liste, "," è il delimitatore appropriato.

+0

È fantastico. Stavo riempiendo le tabelle temporanee con i risultati del CTE e combinando in seguito, ma ho incontrato problemi con i semi-colon quando li ho confezionati in un processo memorizzato. Bel metodo! –

+15

Non dimenticare che 'cte2' può fare riferimento a' cte1' in questo modo: ... cte2 as (SELECT * FROM cte1 WHERE ...) – Chahk

+0

Ottima risposta! :) – pedram

10

Sopra risposta menzionato è giusto:

WITH 
    cte1 as (SELECT * from cdr.Location), 
    cte2 as (SELECT * from cdr.Location) 
select * from cte1 union select * from cte2 

Aditionally, Si può anche ricerca da cte1 in cte2:

WITH 
    cte1 as (SELECT * from cdr.Location), 
    cte2 as (SELECT * from cte1 where val1 = val2) 

select * from cte1 union select * from cte2 

val1,val2 sono solo asumptions per le espressioni ..

Spero che questo blog Aiuterà anche: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

+0

Cosa dire delle espressioni ricorsive e non ricorsive? –

Problemi correlati