SELECT foreignStockId
FROM [Subset].[dbo].[Products]
संभवतः एक NULL
लौटाता है .
ए NOT IN
यदि कोई NULL
है तो क्वेरी कोई पंक्ति नहीं लौटाएगी s NOT IN
. की सूची में मौजूद है मूल्य। आप IS NOT NULL
. का उपयोग करके उन्हें स्पष्ट रूप से बहिष्कृत कर सकते हैं नीचे के रूप में।
SELECT stock.IdStock,
stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN (SELECT foreignStockId
FROM [Subset].[dbo].[Products]
WHERE foreignStockId IS NOT NULL)
या NOT EXISTS
. का उपयोग करके फिर से लिखें इसके बजाय।
SELECT stock.idstock,
stock.descr
FROM [Inventory].[dbo].[Stock] stock
WHERE NOT EXISTS (SELECT *
FROM [Subset].[dbo].[Products] p
WHERE p.foreignstockid = stock.idstock)
साथ ही शब्दार्थ है कि आप NOT EXISTS
. के लिए निष्पादन योजना चाहते हैं जैसा कि यहां देखा गया है अक्सर सरल होता है।
व्यवहार में अंतर का कारण SQL में उपयोग किए जाने वाले तीन मूल्यवान तर्क है। विधेय True
. का मूल्यांकन कर सकते हैं , False
, या Unknown
.
ए WHERE
क्लॉज का मूल्यांकन True
. होना चाहिए पंक्ति को वापस करने के लिए लेकिन NOT IN
. के साथ यह संभव नहीं है जब NULL
नीचे बताए अनुसार मौजूद है।
'A' NOT IN ('X','Y',NULL)
'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
के बराबर है
- 'ए' <> 'एक्स' =
True
- 'ए' <> 'वाई' =
True
- 'ए' <> NULL =
Unknown
True AND True AND Unknown
Unknown
. का मूल्यांकन करता है तीन मूल्यवान तर्क के लिए सत्य सारणी के अनुसार।
निम्नलिखित लिंक में विभिन्न विकल्पों के प्रदर्शन के बारे में कुछ अतिरिक्त चर्चा है।
- क्या मुझे
NOT IN
का उपयोग करना चाहिए? ,OUTER APPLY
,LEFT OUTER JOIN
,EXCEPT
, याNOT EXISTS
? NOT IN
बनामNOT EXISTS
बनामLEFT JOIN / IS NULL
:SQL सर्वरLeft outer join
बनामNOT EXISTS
NOT EXISTS
बनामNOT IN