Tek bir SELECT deyiminde birden çok ortak tablo ifadesine nasıl sahip olabilirim?


94

Karmaşık bir seçme ifadesini basitleştirme sürecindeyim, bu yüzden ortak tablo ifadelerini kullanacağımı düşündüm.

Tek bir cte bildirmek iyi çalışıyor.

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

Aynı SELECT'te birden fazla cte bildirmek ve kullanmak mümkün müdür?

yani bu sql bir hata veriyor

WITH cte1 as (
    SELECT * from cdr.Location
)

WITH cte2 as (
    SELECT * from cdr.Location
)

select * from cte1    
union     
select * from cte2

hata

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. Noktalı virgül koymayı denedim ve bu hatayı alıyorum

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

Muhtemelen alakalı değil ama bu SQL 2008'de.

Yanıtlar:


141

Sanırım şöyle bir şey olmalı:

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

Temel olarak, WITHburada sadece bir cümle ve listeleri alan diğer tümceler gibi, "" de uygun sınırlayıcıdır.


Bu harika. Geçici tabloları CTE sonuçlarıyla dolduruyordum ve daha sonra birleştiriyordum, ancak depolanan bir prosese paketlerken noktalı virgüllerle ilgili sorunlarla karşılaştım. Güzel yöntem!
Tom Halladay

18
Bunun şu cte2şekilde referans verebileceğini unutmayın cte1: ... cte2 olarak (SEÇ * cte1 WHERE ...)
Chahk

Kahraman! Bu beni saatlerdir
şaşırttı

2
yinelemeli ve yinelemeli olmayan ifadeler bildirmeye ne dersiniz?
Dmitry Volkov

15

Yukarıda belirtilen cevap doğrudur:

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

Ayrıca, cte1'deki cte2'den de sorgulayabilirsiniz:

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

select * from cte1 union select * from cte2

val1,val2 sadece ifadeler için varsayımlardır ..

Umarım bu blogun yardımcı olur: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html


yinelemeli ve yinelemeli olmayan ifadeler bildirmeye ne dersiniz?
Dmitry Volkov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.