2010-06-02 39 views
20

सबसे एसक्यूएल में कुशल के बाद अपने परिणाम प्राप्त करने के है:एसक्यूएल: ... जहां एक्स में (वाई से चयन करें ...)

SELECT * 
    FROM Customers 
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS) 

सकने वाली कुछ उपयोग मिलती है बेहतर हो सकता है और एक ही लक्ष्य को हासिल परिणाम?

उत्तर

6

एक कारण यह है कि आप एक JOIN बल्कि NOT IN से उपयोग करने के लिए पसंद कर सकते हैं कि अगर NOT IN खंड में मान किसी भी NULL रों होते हैं आप always get back no results होगा है। यदि आप NOT IN का उपयोग करते हैं तो हमेशा यह विचार करना याद रखें कि उप क्वेरी एक पूर्ण मूल्य वापस ला सकती है या नहीं!

उत्तर: टिप्पणियाँ में प्रश्न

'एक्स' नहीं (शून्य, 'एक', 'बी')

≡ 'एक्स' <> बातिल और 'एक्स' <> 'एक 'और' एक्स '<> ' बी '

≡ अज्ञात और यह सच है और यह सच है

≡ अज्ञात

+0

क्या आप कह रहे हैं कि 'ए' चुनें जहां 'x' नहीं है (नल, 'ए', 'बी') एक खाली परिणाम वापस? – CJ7

+2

@ क्रेग - हाँ बिल्कुल। –

2

शायद कोशिश इस

Select cust.* 

From dbo.Customers cust 
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID 
Where subs.Customer_Id Is Null 
9

किसी भी परिपक्व पर्याप्त SQL डेटाबेस है कि निष्पादित करने के लिए बराबर JOIN के रूप में बस के रूप में प्रभावी रूप से सक्षम होना चाहिए। जो कुछ भी आपको पठनीय है उसका प्रयोग करें।

+4

+1 यह सही है - SQL सर्वर एक ही निष्पादन योजना में 'नहीं IN' और 'EXISTS' प्रकार क्वेरी को बदलता है। – eddiegroves

3
SELECT Customers.* 
    FROM Customers 
WHERE NOT EXISTS (
     SELECT * 
     FROM SUBSCRIBERS AS s 
     JOIN s.Cust_ID = Customers.Customer_ID) 

का उपयोग करते समय "नहीं", क्वेरी पूर्ण तालिका स्कैन नेस्ट निष्पादित करता है, जबकि "मौजूद नहीं है" के लिए, क्वेरी उप क्वेरी के भीतर एक सूचकांक का उपयोग कर सकते हैं।

+2

डेटाबेस पर निर्भर करता है - एसक्यूएल सर्वर एक ही निष्पादन योजना उत्पन्न करेगा और सूचकांक चाहता है (जहां इंडेक्स मौजूद हैं) – eddiegroves

0

यदि आप जानना चाहते हैं कि कौन सा अधिक प्रभावी है, तो आपको अनुमानित क्वेरी योजनाओं या निष्पादन के बाद वास्तविक क्वेरी योजनाओं को देखने का प्रयास करना चाहिए। यह आपको प्रश्नों की लागत बताएगा (मुझे सीपीयू और आईओ लागत दिलचस्प लगती है)। यदि कोई फर्क नहीं पड़ता है तो मुझे आश्चर्य नहीं होगा, लेकिन आप कभी नहीं जानते। मैंने देखा है कि कुछ प्रश्न हमारे डेटाबेस सर्वर पर एकाधिक कोर का उपयोग करते हैं, जबकि उसी क्वेरी का एक पुन: लिखित संस्करण केवल एक कोर का उपयोग करेगा (कहने की जरूरत नहीं है, क्वेरी जो सभी 4 कोर का उपयोग 3 गुना तेज था)। वास्तव में मेरी अंगुली को क्यों नहीं रखा है, लेकिन यदि आप बड़े परिणाम सेट के साथ काम कर रहे हैं, तो इस तरह के मतभेद इसके बारे में जानने के बिना हो सकते हैं।

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