2012-01-09 12 views
11

यूनियन के प्रदर्शन के बाद एक कॉलम पर डिस्टिंट ऑपरेशन कैसे करें?यूनियन को DISTINCT

T1 
-- 
ID Value 
1 1 
2 2 
3 3 

T2 
-- 
ID Value 
1 2 
4 4 
5 5 


मैं मेज पर लौटने के लिए कोशिश कर रहा हूँ:

ID Value 
1 1 
2 2 
3 3 
4 4 
5 5 

मैंने कोशिश की:

SELECT DISTINCT ID, Value 
FROM (SELECT*FROM T1 UNION SELECT*FROM T2) AS T3 

यह काम करने के लिए प्रतीत नहीं होता।

+1

- किस तरह से? –

+0

आप हमें सभी विवरण नहीं दे रहे हैं, क्या मूल्य हमेशा फ़ील्ड 1, न्यूनतम मूल्य, अधिकतम मूल्य, यादृच्छिक मूल्य के समान होना चाहिए ... किसी भी तरह से सभी फ़ील्ड पर विशिष्ट नहीं है, केवल एक फ़ील्ड। –

+2

आपके द्वारा चुने गए एक से बेहतर उत्तर के लिए मेरा उत्तर देखें – Bohemian

उत्तर

15

जहाँ तक मैं कह सकता हूं, "एक कॉलम distinct" नहीं है: distinct हमेशा पूरे रिकॉर्ड पर लागू होता है (जब तक count(distinct name) जैसे कुल में उपयोग नहीं किया जाता है)। इसका कारण यह है कि, एसक्यूएल अनुमान लगा सकता है कि आपके लिए छोड़ने के लिए Value के कौन से मूल्य हैं- और कौन सा ड्रॉप करना है। ऐसा कुछ है जिसे आपको स्वयं परिभाषित करने की आवश्यकता है।

Value की एक विशेष मूल्य का चयन करने के सुनिश्चित करने के लिए ID दोहराया नहीं है GROUP BY उपयोग करने का प्रयास, और किसी भी कुल (यहाँ MIN, कम से कम अपने उदाहरण के रूप में यह था कि बच गया):

SELECT ID, min(Value) FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T2) AS T3 
GROUP BY ID 

वास्तव में होना चाहिए जिसकी आपको जरूरत है। यही है, यह वही प्रश्न नहीं है, और distinct नहीं है - लेकिन यह एक प्रश्न है जो उदाहरण में दिखाए गए कार्यों को वापस कर देगा।

+0

क्या आप वाकई एक ही प्रश्न पूछ रहे हैं? –

+0

मैं सबक्वायरी में 'यूनियन ऑल' का उपयोग करने का सुझाव दूंगा क्योंकि 'DISTINCT' को दो बार करने में कोई बात नहीं है। –

+0

@ मिच व्हाट मुझे यकीन है कि यह नहीं है-लेकिन यह एक प्रश्न है जो उदाहरण में दिखाए गए कार्यों को वापस कर देगा। – alf

25

आप उप-क्वेरी का उपयोग क्यों कर रहे हैं? यह काम करेगा:

SELECT * FROM T1 
UNION 
SELECT * FROM T2 

UNION डुप्लीकेट हटा देता है। (UNION ALL नहीं)

+0

प्वाइंट था, ओपी चाहता था कि "एक फ़ील्ड डिस्टिंट" कहा जाता है, और ऐसी कोई अवधारणा नहीं है। – alf

+1

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

+0

यदि आप यूनियन रिकॉर्ड [1, 1] और [1, 2] रिकॉर्ड करते हैं, तो आप परिणाम सेट में दोनों प्राप्त करेंगे। ओपी पहले कॉलम से दोहराना नहीं चाहता था। जाहिर है यह उत्तर बहुत से लोगों के लिए सहायक था, लेकिन मुझे नहीं लगता कि यह पूछा गया था कि क्या जवाब दिया गया था। – user7733611

2

यह - हालांकि यह धागा पुराना है - ओपी के सवाल के लिए एक समाधान समाधान हो सकता है, भले ही इसे गंदा माना जा सके।

हम पहली तालिका, से सभी टुपल्स का चयन करते हैं, फिर दूसरी तालिका से टुपल्स के साथ जोड़कर (संघ) जोड़ते हैं जिनके पास पहली तालिका में मिलान किया गया विशिष्ट फ़ील्ड नहीं है।

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    Value NOT IN (SELECT Value FROM T1) 
); 
3

मुझे लगता है कि आप क्या मतलब है: "। यह काम करने के लिए प्रतीत नहीं होता"

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    **ID 
** NOT IN (SELECT ID FROM T1) 
); 
+0

मुझे सच में लगता है कि यह प्रश्न का स्वीकार्य उत्तर होना चाहिए। यह आपको प्राथमिकता देता है कि समूह को BY (BY) के साथ MIN() करने के बजाय कौन से तालिका को चुना जाता है। इस पर निर्भर करता है कि ओपी मूल्य कैसे चुनना चाहता था। – user7733611

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