इसे सरल रखना और एक क्वेरी में कई सीटीई कैसे करना है


156

मेरे पास यह सरल टी-एसक्यूएल क्वेरी है, यह एक मेज से स्तंभों का एक गुच्छा उत्सर्जित करता है और अन्य संबंधित तालिकाओं से जानकारी भी जोड़ता है ।

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

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

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

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

मैं वास्तव में इसे पसंद करूंगा, अगर मेरे पास कई सीटीई हो सकते हैं लेकिन मैं नहीं कर सकता, ठीक है? मेरे लिए यहां क्या विकल्प हैं?

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

जवाबों:


297

आपके पास 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 Serverपुनर्मूल्यांकन हो सकता CTEहै, इसलिए यदि आप मानों का उपयोग कर रहे हैं RAND(), NEWID()आदि, तो वे CTEकॉल के बीच बदल सकते हैं ।


3
यह इतना आसान था। MSDN दस्तावेज़ीकरण इस मुद्दे पर थोड़ा फ़िज़ूल था, मुझे निर्णायक कुछ भी नहीं मिला। आपका बहुत बहुत धन्यवाद!
जॉन लीडग्रेन

1
यह आम_समायोजन_प्रकार (लेन-देन-एसक्यूएल) के साथ प्रलेखित है । आप इस वाक्य रचना अनुभाग में हैं (विशेष ध्यान दें देख सकते [ ,...n ]में [ WITH <common_table_expression> [ ,...n ] ]। उदाहरण सी, "एक ही क्वेरी में अनेक CTE परिभाषाओं का उपयोग करना," स्पष्ट रूप से यह पता कहता है। दुख की बात है, इस उदाहरण एसक्यूएल 2008 और के लिए दस्तावेज में प्रदान नहीं की है पुराने (यानी, उदाहरण दिया गया था जब ओपी ने सवाल पोस्ट किया था)।
ब्रायन

मुझे इस पर रिकॉर्ड की दोगुनी राशि मिलती है: /
टॉम स्टिकेल

@TomStickel केवल क्वेरी के आधे हिस्से का उपयोग करने का प्रयास करें, अंतिम से पहलेUNION ALL
क्वासोनी

@Quassnoi हाँ जो काम किया। मैंने टिप्पणी लिखने के बाद ऐसा किया है। यकीन नहीं होता कि वह दूसरा मिलन भी क्यों है ...
टॉम स्टिकेल

90

आप निश्चित रूप से एक एकल क्वेरी अभिव्यक्ति में कई CTEs करने में सक्षम हैं। आपको बस उन्हें अल्पविराम से अलग करने की आवश्यकता है। यहाँ एक उदाहरण है। नीचे दिए गए उदाहरण में, दो सीटीई हैं। एक का नाम 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

5
@ जॉनीलाइडग्रेन: पहले सही उत्तर के 2 मिनट के भीतर एक सही उत्तर पोस्ट करने से एक उत्थान होता है, जो मैंने दिया है, कम से कम।
पीटर माजिद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.