2012-01-24 8 views
6

मैं दो तालिकाओं निम्नलिखित की तरह है जाँच नकल इस यूनियन के साथ इस दो टेबल:सीमा, चुनाव यूनिअन कॉलम

SELECT cod, des 
FROM parameters1 
UNION 
SELECT cod, des 
FROM parameters2 

और मैं इस परिणाम सेट प्राप्त:

+------+-----+ 
| cod | des | 
+------+-----+ 
| 1 | aaa | 
| 2 | bbb | 
| 3 | ccc | 
| 1 | mmm | 

मैं यूनिअन डुप्लिकेट cod स्तंभ के लिए केवल जाँच सीमित करना चाहते हैं, तो मैं कि 1 कॉड परिणाम सेट में दोहराया गया हो बचना चाहते हैं (parameters1) (जब वहाँ अलग नाम और एक ही कॉड के साथ एक रिकॉर्ड है), मैं पहले मेज से नाम प्राप्त करना चाहते हैं:

+------+-----+ 
| cod | des | 
+------+-----+ 
| 1 | aaa | 
| 2 | bbb | 
| 3 | ccc | 

अद्यतन तो मैं parameters1 तालिका (DELETE FROM parameters1 WHERE cod = 1) से रिकॉर्ड 1 को दूर मैं इस परिणाम सेट मिलना चाहिए: केवल एक ही क्षेत्र के लिए एक संघ की डुप्लीकेट जाँच सीमित करने के लिए

+------+-----+ 
| cod | des | 
+------+-----+ 
| 1 | mmm | ---> FROM parameters2 
| 2 | bbb | 
| 3 | ccc | 

क्या यह संभव है या कुछ खेतों? कैसे ?

समाधान को मल्टीडाबेस वातावरण (एमएसएसक्यूएल, पोस्टग्रेएसक्यूएल, माईएसक्यूएल) पर काम करना चाहिए।

+0

[एक स्तंभ के लिए एसक्यूएल सर्वर अलग संघ] (http://stackoverflow.com/questions/7338884/sql-server-distinct-union-for-one-column) – ruakh

+0

कृपया तर्क समझाने के संभावित डुप्लिकेट पंक्ति '(1,' aaa ')' पंक्ति '(1,' mmm ') पर क्यों चुना जाता है' उदाहरण के लिए क्योंकि 'aaa' <'mmm'', शायद? स्वीकृत उत्तर एक मनमानी पंक्ति चुनने लगता है। – onedaywhen

+0

यह तर्क है कि मैंने परिभाषित किया है क्योंकि एक तालिका में प्राथमिकता है ... – aleroot

उत्तर

9
SELECT cod, des 
FROM parameters1 p1 
UNION ALL 
SELECT cod, des 
FROM parameters2 p2 
WHERE NOT EXISTS (
    SELECT 1 
    FROM parameters1 p1sub 
    WHERE p1sub.cod = p2.cod 
) 
+0

शानदार समाधान, धन्यवाद! – aleroot

+2

यह सही है लेकिन यह 'यूनियन ऑल' के साथ तेज़ होना चाहिए। –

+0

@ypercube बहुत अच्छा बिंदु, यहां किसी भी डुप्लिकेट को फ़िल्टर करने का प्रयास करने की आवश्यकता नहीं है ... अपडेट किया गया। –

2

this link में समाधान उन वातावरणों के अनुकूल होना चाहिए, क्योंकि यह मानक एसक्यूएल है (यदि COALESCE उपलब्ध नहीं है तो आप ISNULL का उपयोग कर सकते हैं)। मुझे यकीन नहीं है कि FULL OUTER JOIN की उपलब्धता क्या है, लेकिन यह सभी तीन प्लेटफार्मों पर भी उपलब्ध होनी चाहिए।

आपके मामले में, समाधान की तरह लग रही खत्म हो जाएगा:

SELECT p1.cod, ISNULL(p1.des, p2.des) AS des 
FROM parameters1 p1 
    FULL OUTER JOIN parameters2 p2 ON p1.cod = p2.cod 

... लेकिन ... MySQL जाहिरा तौर पर FULL OUTER JOIN का समर्थन नहीं करता है, तो आप उस मामले में एक और चाल का उपयोग कर सकते हैं:

SELECT p1.cod, ISNULL(p1.des, p2.des) AS des 
FROM parameters1 p1 
    LEFT JOIN parameters2 p2 ON p1.cod = p2.cod 
UNION ALL 
SELECT p2.cod, p2.des 
FROM parameters2 p2 
    LEFT JOIN parameters1 p1 ON p1.cod = p2.cod 
WHERE p1.cod IS NULL 
+0

समाधान उन मामलों को कवर नहीं करता है जहां पैरामीटर केवल दूसरी तालिका में रहता है, यह परिणाम हमेशा पहली तालिका से सरल चयन के समान होगा – newtover

+0

अच्छा बिंदु।एक पूर्ण बाहरी जॉइन को ठीक करना चाहिए। – mwigdahl

+0

यह काम नहीं करता है क्योंकि अगर मैं पैरामीटर 1 से रिकॉर्ड हटा देता हूं तो मुझे कुछ भी नहीं मिलता है ... अद्यतन प्रश्न देखें, और प्रश्न में ज्यादा सटीक नहीं होने के लिए खेद है। – aleroot

0

केवल पैरामीटर 2 प्राप्त करने के लिए दूसरी यूनियन क्वेरी बदलें, जहां पैरामीटर 2.id पैरामीटर 1 में नहीं है।

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