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 EXISTSNOT EXISTSबनामNOT IN