मैं एकल चयन कथन में एक से अधिक सामान्य तालिका अभिव्यक्ति कैसे कर सकता हूं?


92

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

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

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

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

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

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 ';'.

शायद प्रासंगिक नहीं है लेकिन यह SQL 2008 पर है।

जवाबों:


139

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

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

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


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

18
मत भूलो कि cte2इस cte1तरह का संदर्भ हो सकता है: ... cte2 as (Select * Fte cte1 WHERE ...)
चाख

नायक! इसने मुझे घंटों तक
रोक दिया है

2
पुनरावर्ती और गैर-पुनरावर्ती अभिव्यक्तियों की घोषणा के बारे में क्या?
दिमित्री वोल्कोव

14

उपर्युक्त उत्तर सही है:

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

Adte, आप cte1 से 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 भावों के लिए सिर्फ संयोग हैं ।।

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


पुनरावर्ती और गैर-पुनरावर्ती अभिव्यक्तियों की घोषणा के बारे में क्या?
दिमित्री वोल्कोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.