2009-11-09 15 views

उत्तर

5

मुझे लगता है कि यह एक ही उद्देश्य परोसता है।

not in कर सकते हैं भी शाब्दिक मान ले जबकि not exists एक प्रश्न की जरूरत के साथ परिणामों की तुलना करने।

संपादित करें: क्योंकि यह join बाहरी क्वेरी & साथ, सूचकांक के उपयोग करने के लिए नेतृत्व कर सकते हैं कर सकते हैं मापदंड स्तंभ अनुक्रमणित है का उपयोग करता है, तो not exists उपयोग करने के लिए अच्छा हो सकता है।

EDIT2: this प्रश्न भी देखें।

EDIT3: मुझे ऊपर की चीजें वापस लेने दें।
this लिंक देखें। मुझे लगता है, यह सब इस बात पर निर्भर करता है कि डीबी डेटाबेस 0/इंडेक्स आदि पर & का अनुवाद कैसे करता है

+0

nulls के उपचार के बारे में भूल नहीं है: http://stackoverflow.com/questions/1699424/what-the-difference -बेटवीन-इन-इन-एंड-नॉन-इन-ऑरैकल-क्वेरी/1703712 # 1703712 –

+0

टॉम क्यटे लिंक निश्चित रूप से इस मामले की जड़ तक पहुंच जाता है। –

0

प्रदर्शन अंतर भिन्न हो सकता है, जिसमें तेजी से मौजूद है।

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

आप पाते हैं कि नल का अस्तित्व विफल होने के कारण मौजूद है।

प्रत्येक का उपयोग करने के लिए बेहतर स्पष्टीकरण के लिए जो सेल्को की 'स्मार्टज़ के लिए एसक्यूएल' देखें।

0

तत्वों के एक समूह में किसी तत्व के वर्तमान के लिए परीक्षण नहीं है, इसलिए यह आसान है।

समूहिंग समेत अधिक जटिल प्रश्नों को संभाल नहीं सकता है (उदाहरण के लिए योग (x) = z या गिनती (*)> 3), कई स्थितियों के साथ परिणाम (उदाहरण के लिए एकाधिक तत्व मिलान करना), और इंडेक्स का लाभ उठा सकते हैं ।

कुछ परिस्थितियों में मौजूद नहीं है, यह मौजूद नहीं है। मुझे आम तौर पर यह पता चलता है कि मैं मूल्यों के सेट में एक प्रमुख फ़ील्ड के मान के लिए परीक्षण कर रहा हूं।

अंगूठे के नियम के रूप में, मैं अस्तित्व में नहीं रहना चाहता क्योंकि इसमें बहुत अधिक स्थितियों को शामिल नहीं किया गया है। अस्तित्व में नहीं है, हर स्थिति के लिए उपयोग नहीं किया जा सकता है, लेकिन विपरीत नहीं है।

13

नहीं में के बीच का अंतर और मौजूद नहीं स्पष्ट हो जाता है, जहां NULL मूल्यों परिणाम में शामिल नहीं है।

उदाहरण के लिए:

create table test_a (col1 varchar2(30 char)); 
create table test_b (col1 varchar2(30 char)); 

insert into test_a (col1) values ('a'); 
insert into test_a (col1) values ('b'); 
insert into test_a (col1) values ('c'); 
insert into test_a (col1) values ('d'); 
insert into test_a (col1) values ('e'); 

insert into test_b (col1) values ('a'); 
insert into test_b (col1) values ('b'); 
insert into test_b (col1) values ('c'); 
insert into test_b (col1) values (null); 

नोट: वे मुख्य अंतर यह है कि test_b एक null मूल्य होता है।

select * from test_a where col1 not in (select col1 from test_b); 

कोई पंक्ति नहीं

select * from test_a where 
    not exists 
     (select 1 from test_b where test_b.col1 = test_a.col1); 

रिटर्न

लौटे
col1 
==== 
d 
e 
+0

@Gold: मुझे लगता है कि आपको यह जवाब स्वीकार करना चाहिए, भविष्य में आगंतुकों को सीधे बैल की आंख पाने में मदद मिलेगी। – hagrawal

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