2009-02-25 13 views
80

Karmaşık bir seçim deyimini basitleştirme işlemindeyim, bu yüzden ortak tablo ifadelerini kullanacağımı düşünün.Tek bir SELECT ifadesinde birden çok ortak tablo ifadesine nasıl sahip olabilirim?

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ü? Bu sql yani

bir hatayı verir

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 olduğunu. Ben de noktalı virgül koyarak çalıştı ve bu hatayı Muhtemelen

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

ilgili olmayan olsun ama bu gibi bir şey olması gerektiğini düşünüyorum SQL 2008.

cevap

115

üzerindedir adres: Temelde

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

, WITH olduğunu Burada sadece bir yan tümce ve listeleri alan diğer maddeler gibi "," uygun sınırlayıcıdır. sözü cevap Üstü

+0

Bu harika. Tempo tablolarını CTE sonuçlarıyla doldurup daha sonra birleştiriyordum, ancak depolanmış bir proba paketlendiğinde yarı kolonlarla ilgili problemlerle karşılaştım. Güzel yöntem! –

+15

'cte2' 'cte1' gibi başvuruda bulunabileceğini unutmayın: ... cte2 olarak (SELECT * FROM cte1 WHERE ...) – Chahk

+0

Harika cevap! :) – pedram

10

haklı:

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

Aditionally, Ayrıca cte2 içinde cte1 sorgulayabilir:

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

select * from cte1 union select * from cte2 

val1,val2 ifadeleri sadece asumptions vardır .. Bu blog

Umut ayrıca yardımcı olacaktır: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

+0

Özyinelemeli ve özyinelemeyen ifadeleri açıklamaya ne dersiniz? –