2009-05-13 21 views
7

इन दो तालिकाओं को देखते हुए से:रोकें ओरेकल शून्य बयान को हटाने डुप्लिकेट

CREATE TABLE TEST1 (TEST VARCHAR2(1 BYTE)) 
CREATE TABLE TEST2 (TEST VARCHAR2(1 BYTE)) 

कहाँ Test1 दोनों मूल्य 'ए' के ​​साथ दो पंक्तियां हैं और Test2 मूल्य 'बी' के साथ एक पंक्ति है।

जब मैं इस कमांड चलाएँ:

SELECT TEST FROM TEST1 
MINUS 
SELECT TEST FROM TEST2 

मैं आउटपुट प्राप्त:

Test 
----- 
A 

ऐसा लगता है कि माइनस डुप्लिकेट को हटा (के रूप में वहाँ दो 'ए' Test1 में पंक्तियों हैं)।

डुप्लिकेट मान (दो 'ए' पंक्तियों को वापस करने के लिए आपको MINUS क्वेरी कैसे मिल सकती है?

उत्तर

0

Oracle में बयान में एकाधिक स्तंभों का समर्थन करता है, तो आप लिख सकते हैं:

SELECT a, b, c 
FROM table1 
WHERE (a,b,c) not in (
    select a,b,c from table2 
) 
0

सभी संशोधक यूनियन को सभी पंक्तियां (उदाहरण के लिए, यूनियन ऑल) वापस कर देता है, शायद इसे MINUS पर लागू किया जा सकता है?

select field1 from table1 
minus all 
select field2 from table2 
+0

यह मुझे डर नहीं सकता – cagcowboy

+0

नहीं। इससे बहुत अधिक समझ आएगी;) –

0

कम से कम भाग का हिस्सा डुप्लीकेट को हटा देता है। डुप्लिकेट को हटाने से बचने के लिए NOT IN का उपयोग करने पर विचार करें।

SELECT TEST FROM TEST1 WHERE TEST NOT IN(SELECT TEST FROM TEST2) 
1
SELECT field1 FROM table1 WHERE field1 NOT IN (SELECT field2 FROM table2) 

इतने लंबे समय के रूप में काम field2 NULLs को शामिल नहीं कर सकते हैं।

+0

एकमात्र चीज यह है कि वास्तविकता में मैं जिस माइनस स्टेटमेंट का उपयोग कर रहा हूं वह केवल एक फ़ील्ड से अधिक चुन रहा है (यह 10 फ़ील्ड का चयन कर रहा है)। –

+0

आप इसे कई कॉलम के साथ भी कर सकते हैं ...जहां (ए, बी) नहीं (तालिका 2 से वाई, वाई 2) –

7

एक अन्य विकल्प:

SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST1 
MINUS 
SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST2 

यह प्रत्येक दो प्रतियों में एक अलग प्रविष्टि के रूप में इलाज के साथ माइनस होगा। नीचे दिए गए उदाहरण में ध्यान दें, यदि टेस्ट 1 में दो 'सी' मान हैं और टेस्ट 2 में केवल एक है, तो आप आउटपुट में से एक प्राप्त करते हैं।

dev> select * from test1; 

T 
- 
A 
A 
B 
C 
C 

dev> select * from test2; 

T 
- 
B 
C 

dev>  SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST1 
    2  MINUS 
    3  SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST2 
    4/

T ROW_NUMBER()OVER(PARTITIONBYTESTORDERBYTEST) 
- -------------------------------------------- 
A           1 
A           2 
C           2 
1

"नहीं" जवाब सभी सही हैं। एक वैकल्पिक है, जो कुछ परिदृश्यों के लिए आसान हो सकता है, कि "मौजूद नहीं है" ऑपरेटर:

SELECT TEST FROM TEST1 
WHERE NOT EXISTS 
(SELECT null FROM TEST2 WHERE TEST2.TEST = TEST1.TEST); 

(नोट: "अशक्त" का चयन करें खंड में यहाँ कोई मतलब नहीं है)

मैं व्यक्तिगत रूप से दोनों विधियों का उपयोग , लेकिन मुझे अक्सर EXISTS पसंद नहीं है क्योंकि यह अधिक लचीला है - उदाहरण के लिए, समानता की स्थिति पर तुलना की आवश्यकता नहीं होती है।

ऑप्टिमाइज़र के हाल के संस्करण अक्सर एक नॉन इनस्टिस्ट्स में परिवर्तित नहीं होंगे, या इसके विपरीत; हालांकि, यदि आप पुराने संस्करण पर हैं (उदाहरण के लिए 8i या यहां तक ​​कि 9आई मुझे लगता है) तो आप इन दो तरीकों के बीच स्विचिंग से प्रदर्शन लाभ देख सकते हैं।

0
SELECT TEST FROM TEST1 WHERE TEST IN(
SELECT TEST FROM TEST1 
MINUS 
SELECT TEST FROM TEST2); 
+0

कृपया बताएं कि आपका उत्तर समस्या का समाधान कैसे करता है, इससे सभी स्पष्टता और भविष्य के संदर्भ के लिए आपके समाधान को समझने में मदद मिलेगी। – Aziz

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