अगर b
अशक्त है, यह कोई बग नहीं है। समस्या यह है कि SQL सर्वर NOT IN
बदल जाता है <> 1 AND <> 2 AND <> 3
. की श्रृंखला में आदि। यदि आपके पास <> NULL
. है , जो अज्ञात लौटाता है, जिसका इस मामले में अर्थ असत्य है। विभिन्न परिदृश्यों में यह सभी को योग्य या अयोग्य घोषित कर सकता है पंक्तियाँ। LEFT JOIN
के बजाय दृष्टिकोण, आपको कहना चाहिए:
FROM dbo.OuterTable AS t
WHERE NOT EXISTS (SELECT 1 FROM x WHERE b = t.a);
यहाँ एक त्वरित प्रदर्शन है:
DECLARE @x TABLE(i INT);
INSERT @x VALUES(1),(2);
DECLARE @y TABLE(j INT);
INSERT @y VALUES(2),(NULL);
SELECT i FROM @x WHERE i NOT IN -- produces zero results
(SELECT j FROM @y);
SELECT i FROM @x AS x WHERE NOT EXISTS -- produces one result
(SELECT 1 FROM @y WHERE j = x.i);
बहुत अधिक विवरण के लिए (और मेट्रिक्स यह साबित करने के लिए कि NOT EXISTS
. क्यों सबसे अच्छा विकल्प है):
http://www.sqlperformance.com /2012/12/टी-एसक्यूएल-क्वेरी/लेफ्ट-एंटी-सेमी-जॉइन
इसके अलावा, कृपया गेल शॉ की इस ब्लॉग पोस्ट को पढ़ें:
http://sqlinthewild. co.za/index.php/2010/02/18/not-exists-vs-not-in/