2010-01-26 6 views
79

मेरे पास यह सरल टी-एसक्यूएल क्वेरी है, यह तालिका से कॉलम का एक समूह उत्सर्जित करता है और अन्य संबंधित तालिकाओं से जानकारी में भी शामिल होता है।इसे सरल रखना और क्वेरी में एकाधिक सीटीई कैसे करें

मेरा डेटा मॉडल सरल है। मेरे पास प्रतिभागियों के साथ एक निर्धारित कार्यक्रम है। मुझे यह जानने की जरूरत है कि प्रत्येक कार्यक्रम में कितने प्रतिभागी भाग लेते हैं।

इसका मेरा समाधान एक सीटीई जोड़ना है जो समूह निर्धारित कार्यक्रमों और प्रतिभागियों की संख्या की गणना करता है।

यह मुझे प्रति निर्धारित घटना में उस जानकारी में शामिल होने की अनुमति देगा। क्वेरी को सरल रखना।

मुझे अपने प्रश्नों को सरल रखना पसंद है, हालांकि, अगर मुझे भविष्य में कभी भी मेरी सरल क्वेरी के दौरान अदला-बदली अस्थायी परिणाम उपलब्ध कराने की आवश्यकता है, तो मैं क्या करूँ?

मुझे वास्तव में यह पसंद आएगा, अगर मेरे पास एकाधिक सीटीई हो सकते हैं लेकिन मैं नहीं कर सकता, है ना? मेरे लिए यहां क्या विकल्प हैं?

मैंने एप्लिकेशन डेटा परत पर विचारों और काम करने से इंकार कर दिया है। मैं अपने एसक्यूएल प्रश्नों को अलग करना पसंद करता हूं।

उत्तर

158

आप एक क्वेरी में अनेक CTE रों हो सकता है, साथ ही पुन: उपयोग एक CTE:

WITH cte1 AS 
     (
     SELECT 1 AS id 
     ), 
     cte2 AS 
     (
     SELECT 2 AS id 
     ) 
SELECT * 
FROM cte1 
UNION ALL 
SELECT * 
FROM cte2 
UNION ALL 
SELECT * 
FROM cte1 

हालांकि, ध्यान दें कि SQL ServerCTE प्रत्येक बार इस तक पहुंच का पुनर्मूल्यांकन कर सकते हैं, इसलिए यदि आप मूल्यों का उपयोग कर रहे जैसे RAND(), NEWID() इत्यादि, वे CTE कॉल के बीच बदल सकते हैं।

+1

यह इतना आसान था। इस मुद्दे के आसपास एमएसडीएन दस्तावेज थोड़ा अस्पष्ट था, मुझे कुछ भी निर्णायक नहीं मिला। आपका बहुत बहुत धन्यवाद! –

+1

यह [common_table_expression (ट्रांजैक्ट-एसक्यूएल)] के साथ प्रलेखित है (http://msdn.microsoft.com/en-us/library/ms175972.aspx)। आप देख सकते हैं कि यह वाक्यविन्यास अनुभाग में हैं ('[, ... n]' के साथ [[<_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ एक प्रश्न, "यह स्पष्ट रूप से कॉल करता है। अफसोस की बात है, यह उदाहरण SQL 2008 और पुराने के लिए प्रलेखन में प्रदान नहीं किया गया है (यानी, ओपी प्रश्न पोस्ट करते समय उदाहरण प्रदान नहीं किया गया था) – Brian

51

आप निश्चित रूप से एक ही क्वेरी अभिव्यक्ति में एकाधिक सीटीई प्राप्त करने में सक्षम हैं। आपको बस उन्हें अल्पविराम से अलग करने की आवश्यकता है। यहाँ एक उदाहरण है। नीचे दिए गए उदाहरण में, दो सीटीई हैं। एक को CategoryAndNumberOfProducts नाम दिया गया है और दूसरा नाम ProductsOverTenDollars है।

WITH CategoryAndNumberOfProducts (CategoryID, CategoryName, NumberOfProducts) AS 
(
    SELECT 
     CategoryID, 
     CategoryName, 
     (SELECT COUNT(1) FROM Products p 
     WHERE p.CategoryID = c.CategoryID) as NumberOfProducts 
    FROM Categories c 
), 

ProductsOverTenDollars (ProductID, CategoryID, ProductName, UnitPrice) AS 
(
    SELECT 
     ProductID, 
     CategoryID, 
     ProductName, 
     UnitPrice 
    FROM Products p 
    WHERE UnitPrice > 10.0 
) 

SELECT c.CategoryName, c.NumberOfProducts, 
     p.ProductName, p.UnitPrice 
FROM ProductsOverTenDollars p 
    INNER JOIN CategoryAndNumberOfProducts c ON 
     p.CategoryID = c.CategoryID 
ORDER BY ProductName 
+2

@ जॉन लिडेग्रेन: एक सही उत्तर पोस्ट करना पहले सही उत्तर के 2 मिनट के भीतर एक अपवॉट, जो मैंने दिया है, कम से कम –

+0

क्या एक व्यर्थ टिप्पणी है। "एसओ (स्टैक ओवरफ्लो) काफी भारी है" - और शुक्र है कि यह आदमी मॉडरेटर में से एक नहीं है। –