शुरुआत के लिए
, एक (और अन्य प्रणालियों में) कैसे NOT IN
विधेय SQL Server
में काम करता है पर अपने ब्लॉग में एक पुराने लेख के लिए लिंक:
आप इसे निम्नानुसार लिख सकते हैं:
SELECT *
FROM Orders o
WHERE NOT EXISTS
(
SELECT NULL
FROM HeldOrders ho
WHERE ho.OrderID = o.OrderID
)
, हालांकि, अधिकांश डेटाबेस इन प्रश्नों का इलाज करेंगे।
ये दोनों प्रश्न ANTI JOIN
किसी प्रकार का उपयोग करेंगे। ,
SELECT *
FROM Orders o
WHERE (col1, col2) NOT IN
(
SELECT col1, col2
FROM HeldOrders ho
)
नोट तथापि, NOT IN
मुश्किल हो सकता है कि जिस तरीके के लिए यह NULL
व्यवहार करता है:
यह आप इस वाक्य रचना का समर्थन नहीं करता दो या अधिक स्तंभों की जाँच करना चाहते हैं SQL Server
के बाद से, SQL Server
के लिए उपयोगी है मान।
हैं Held.Orders
व्यर्थ है, कोई रिकॉर्ड पाया जाता है और सबक्वेरी रिटर्न लेकिन एक भी NULL
, पूरे क्वेरी कुछ भी नहीं (दोनों IN
और NOT IN
इस मामले में NULL
करने का मूल्यांकन करेंगे) वापस आ जाएगी।
Orders:
OrderID
---
1
HeldOrders:
OrderID
---
2
NULL
इस क्वेरी:
SELECT *
FROM Orders o
WHERE OrderID NOT IN
(
SELECT OrderID
FROM HeldOrders ho
)
कुछ भी नहीं, जो शायद नहीं है कि तुम क्या उम्मीद थी वापस आ जाएगी
इन आंकड़ों पर विचार करें।
बहरहाल, यह एक:
SELECT *
FROM Orders o
WHERE NOT EXISTS
(
SELECT NULL
FROM HeldOrders ho
WHERE ho.OrderID = o.OrderID
)
OrderID = 1
साथ पंक्ति वापस आ जाएगी।
ध्यान दें कि LEFT JOIN
दूसरों द्वारा प्रस्तावित समाधान सबसे कुशल समाधान होने से बहुत दूर हैं।
इस क्वेरी:
SELECT *
FROM Orders o
LEFT JOIN
HeldOrders ho
ON ho.OrderID = o.OrderID
WHERE ho.OrderID IS NULL
एक फिल्टर शर्त यह है कि मूल्यांकन करने और सभी को फ़िल्टर पंक्तियों जो numerius हो सकता है मिलान करने की आवश्यकता होगी का उपयोग करेगा
दोनों IN
और EXISTS
द्वारा इस्तेमाल किया एक ANTI JOIN
विधि होगा बस यह सुनिश्चित करने की आवश्यकता है कि में प्रत्येक पंक्ति के प्रति एक बार मौजूद नहीं है, इसलिए यह पहले सभी संभावित डुप्लीकेट को खत्म कर देगा:
NESTED LOOPS ANTI JOIN
और MERGE ANTI JOIN
बस जब HeldOrders
का मूल्यांकन डुप्लिकेट को छोड़ देगा।
- ए
HASH ANTI JOIN
हैश तालिका बनाते समय डुप्लिकेट को खत्म कर देगा।
सबसे अच्छा तरीका विभिन्न दृष्टिकोणों को आजमाने और निष्पादन योजनाओं की जांच करना है। – pjp
मेरी स्थिति में SQL Server 2000, प्रश्न में तालिकाओं पर इंडेक्स दिए गए "जॉइन" क्वेरी सबसे तेज थी। चयन * ऑर्डर से बाएं जॉइन हेल्डऑर्डर्स ओ ओ.ऑर्डर_आईडी = एच.ऑर्डर_आईडी और एच। ऑर्डर_आईडी शून्य – Stimy