Bagaimana saya bisa memiliki beberapa ekspresi tabel umum dalam satu pernyataan SELECT?

94

Saya sedang dalam proses menyederhanakan pernyataan pilih yang rumit, jadi saya pikir saya akan menggunakan ekspresi tabel umum.

Mendeklarasikan satu cte berfungsi dengan baik.

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

Apakah mungkin untuk mendeklarasikan dan menggunakan lebih dari satu cte dalam SELECT yang sama?

yaitu sql ini memberikan kesalahan

WITH cte1 as (
    SELECT * from cdr.Location
)

WITH cte2 as (
    SELECT * from cdr.Location
)

select * from cte1    
union     
select * from cte2

kesalahannya adalah

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. Saya telah mencoba memasukkan titik koma dan mendapatkan kesalahan ini

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

Mungkin tidak relevan tapi ini ada di SQL 2008.

Paul Rowland
sumber

Jawaban:

141

Saya pikir itu harus seperti:

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

Pada dasarnya, WITHini hanyalah klausa di sini, dan seperti klausa lain yang menggunakan daftar, "," adalah pemisah yang sesuai.

MarkusQ
sumber
Itu luar biasa. Saya telah mengisi tabel temp dengan hasil CTE dan menggabungkannya nanti, tetapi mengalami masalah dengan titik koma saat mengemas ke dalam proc yang disimpan. Metode yang bagus!
Tom Halladay
18
Jangan lupa yang cte2bisa mereferensikan cte1seperti ini: ... cte2 as (SELECT * FROM cte1 WHERE ...)
Chahk
Pahlawan! Ini telah membuat saya bingung selama berjam
bjpelcdev
2
bagaimana dengan mendeklarasikan ekspresi rekursif dan non-rekursif?
Dmitry Volkov
15

Jawaban yang disebutkan di atas benar:

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

Selain itu, Anda juga dapat melakukan kueri dari cte1 di 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 hanyalah asumsi untuk ekspresi ..

Semoga blog ini juga dapat membantu: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

Sagar Dev Timilsina
sumber
bagaimana dengan mendeklarasikan ekspresi rekursif dan non-rekursif?
Dmitry Volkov