2009-02-25 14 views
80

मैं एक जटिल चयन कथन को सरल बनाने की प्रक्रिया में हूं, इसलिए सोचा कि मैं सामान्य तालिका अभिव्यक्तियों का उपयोग करूंगा।एक एकल चयन कथन में मेरे पास एकाधिक सामान्य तालिका अभिव्यक्तियां कैसे हो सकती हैं?

एकल सीटीई घोषित करना ठीक काम करता है।

WITH cte1 AS (
    SELECT * from cdr.Location 
    ) 

select * from cte1 

क्या एक ही चयन में एक से अधिक सीटीई घोषित करना और उपयोग करना संभव है?

इस एसक्यूएल यानी त्रुटि देता

WITH cte1 as (
    SELECT * from cdr.Location 
) 

WITH cte2 as (
    SELECT * from cdr.Location 
) 

select * from cte1  
union  
select * from cte2 

त्रुटि

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. 

एनबी है। मैं में अर्धविराम डालने की कोशिश की और इस त्रुटि

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

प्रासंगिक नहीं मिल लेकिन इस एसक्यूएल 2008

उत्तर

115

पर है मुझे लगता है कि यह कुछ ऐसा होना चाहिए है:

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

असल में, WITH है यहां सिर्फ एक खंड, और सूचियों वाले अन्य खंडों की तरह, "," उपयुक्त डेलीमीटर है।

+0

यह कमाल है। मैं सीटीई के परिणामों के साथ अस्थायी तालिकाओं को भर रहा था और बाद में संयोजन कर रहा था, लेकिन एक संग्रहित proc में पैकेजिंग करते समय अर्ध कोलन के साथ समस्याओं में भाग गया। अच्छी विधि! –

+15

यह मत भूलना कि 'cte2'' cte1' को संदर्भित कर सकता है: ... cte2 के रूप में (चयन करें * सीटीई 1 से ...) – Chahk

+0

महान उत्तर! :) – pedram

10

उल्लेख जवाब से ऊपर सही है:

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

Aditionally, तुम भी cte2 में cte1 से क्वेरी कर सकते हैं:

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

select * from cte1 union select * from cte2 

val1,val2 सिर्फ भाव के लिए asumptions हैं ..

आशा इस ब्लॉग यह भी मदद करेगा: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

+0

रिकर्सिव और गैर-रिकर्सिव अभिव्यक्तियों को घोषित करने के बारे में क्या? –

संबंधित मुद्दे

 संबंधित मुद्दे