2009-10-22 10 views
17

में संघ के साथ समूह का उपयोग कैसे करें मैं टी-एसक्यूएल में यूनियन के साथ समूह का उपयोग कैसे कर सकता हूं? मैं यूनियन के परिणाम के पहले कॉलम द्वारा समूह करना चाहता हूं, मैंने निम्नलिखित एसक्यूएल लिखा लेकिन यह काम नहीं करता है। मैं सिर्फ यूनियन नतीजे के निर्दिष्ट कॉलम (इस मामले में 1) का संदर्भ नहीं देता हूं। बहुत धन्यवाद।टी-एसक्यूएल

SELECT * 
FROM (SELECT a.id , 
        a.time 
      FROM  dbo.a 
      UNION 
      SELECT b.id , 
        b.time 
      FROM  dbo.b 
     ) 
GROUP BY 1 

उत्तर

14

ग्रुप द्वारा 1

मैं नहीं देखा ग्रुप द्वारा ऑर्डिनल्स, द्वारा केवल आदेश का उपयोग कर समर्थन करने के लिए। किसी भी तरह से, केवल MySQL ग्रुप BY का समर्थन करता है जिसमें सभी कॉलम शामिल नहीं होते हैं, जो उनके द्वारा किए गए कुल कार्यों के बिना होते हैं। ऑर्डिनल्स को अभ्यास की अनुशंसा नहीं की जाती है क्योंकि यदि वे चयन के क्रम पर आधारित होते हैं - यदि वह बदलता है, तो आपका ऑर्डर (या समर्थित होने पर ग्रुप) करता है।

का उपयोग करते समय सामग्री पर GROUP BY चलाने की कोई आवश्यकता नहीं है - यूनियन यह सुनिश्चित करता है कि डुप्लिकेट हटा दिए गए हैं;

SELECT a.id, 
     a.time 
    FROM dbo.TABLE_A a 
UNION 
SELECT b.id, 
     b.time 
    FROM dbo.TABLE_B b 
6

स्तंभ की पहचान करना आसान है::

SELECT * 
FROM (SELECT id, 
        time 
      FROM  dbo.a 
      UNION 
      SELECT id, 
        time 
      FROM  dbo.b 
     ) 
GROUP BY id 
- क्योंकि यह नहीं है UNION ALL तेजी से होता है और उस मामले में आप ग्रुप द्वारा की आवश्यकता होगी ...

आपकी क्वेरी केवल होने की जरूरत है

लेकिन यह इस क्वेरी की मुख्य समस्या को हल नहीं करता है: पहले कॉलिंग पर दूसरे कॉलम मानों के साथ क्या किया जाना है? चूंकि (अनजाने में!) आप UNION का उपयोग UNION ALL के बजाय कर रहे हैं, तो आपके पास पूरी तरह से संघ में दो उप-सारणी के बीच पंक्तियों को डुप्लीकेट नहीं किया जाएगा, लेकिन आप अभी भी आईडी के एक मान के लिए कई मूल्यों के साथ बहुत अच्छे हो सकते हैं, और आप जो भी करना चाहते हैं उसका कोई संकेत नहीं देते - न्यूनतम, अधिकतम, औसत, योग, या क्या ?! एसक्यूएल इंजन को इसके कारण एक त्रुटि देनी चाहिए (हालांकि कुछ जैसे कि MySQL केवल कई में से एक यादृच्छिक-आईएसएच मान चुनते हैं, मेरा मानना ​​है कि एसक्यूएल-सर्वर उससे बेहतर है)।

तो, उदाहरण के लिए, पहली पंक्ति को SELECT id, MAX(time) या इस तरह बदलें!

67

आपको सबक्वायरी को उपनाम करने की आवश्यकता है। इस प्रकार, आपका कथन होना चाहिए:

Select Z.id 
From (
     Select id, time 
     From dbo.tablea 
     Union All 
     Select id, time 
     From dbo.tableb 
     ) As Z 
Group By Z.id 
+1

धन्यवाद @ थॉमस, सरल से अच्छा है! – ghiboz

+7

यह स्वीकार्य उत्तर होना चाहिए। –

+1

कुंजी बिंदु subquery (AS Z) – isxaker

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