यह उन उत्तरों से निष्कर्ष निकाला जा सकता है जो NOT IN (subquery)
नल को सही ढंग से नहीं संभालते हैं और उन्हें इसके पक्ष में नहीं जाना चाहिए NOT EXISTS
। हालांकि, ऐसा निष्कर्ष समय से पहले हो सकता है। निम्नलिखित परिदृश्य में, क्रिस डेट (डेटाबेस प्रोग्रामिंग और डिज़ाइन, वॉल्यूम 2 नं 9, सितंबर 1989) को श्रेय दिया जाता है, यह है NOT IN
कि नल सही ढंग से संभालता है और इसके बजाय सही परिणाम देता है NOT EXISTS
।
sp
आपूर्तिकर्ताओं ( sno
) का प्रतिनिधित्व करने के लिए एक तालिका पर विचार करें जो pno
मात्रा ( qty
) में भागों ( ) की आपूर्ति करने के लिए जाने जाते हैं । वर्तमान में तालिका में निम्न मान हैं:
VALUES ('S1', 'P1', NULL),
('S2', 'P1', 200),
('S3', 'P1', 1000)
ध्यान दें कि मात्रा अशक्त है अर्थात इस तथ्य को रिकॉर्ड करने में सक्षम होने के लिए कि एक आपूर्तिकर्ता को भागों की आपूर्ति करने के लिए जाना जाता है, भले ही वह किस मात्रा में ज्ञात न हो।
कार्य उन आपूर्तिकर्ताओं को ढूंढना है जो आपूर्ति भाग संख्या 'P1' के रूप में जाने जाते हैं, लेकिन 1000 की मात्रा में नहीं।
NOT IN
आपूर्तिकर्ता 'S2' को केवल सही पहचानने के लिए निम्नलिखित उपयोग करता है:
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1', NULL ),
( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT DISTINCT spx.sno
FROM sp spx
WHERE spx.pno = 'P1'
AND 1000 NOT IN (
SELECT spy.qty
FROM sp spy
WHERE spy.sno = spx.sno
AND spy.pno = 'P1'
);
हालाँकि, नीचे दी गई क्वेरी समान सामान्य संरचना का उपयोग करती है, लेकिन NOT EXISTS
परिणाम में आपूर्तिकर्ता 'S1' को गलत तरीके से शामिल करता है (अर्थात जिसके लिए मात्रा शून्य है):
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1', NULL ),
( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT DISTINCT spx.sno
FROM sp spx
WHERE spx.pno = 'P1'
AND NOT EXISTS (
SELECT *
FROM sp spy
WHERE spy.sno = spx.sno
AND spy.pno = 'P1'
AND spy.qty = 1000
);
तो NOT EXISTS
क्या यह चांदी की गोली नहीं है जो दिखाई दे सकती है!
बेशक, समस्या का स्रोत नल की उपस्थिति है, इसलिए उन नल को समाप्त करने के लिए 'वास्तविक' समाधान है।
यह दो तालिकाओं का उपयोग करके (अन्य संभावित डिजाइनों के बीच) प्राप्त किया जा सकता है:
sp
आपूर्तिकर्ताओं भागों की आपूर्ति करने के लिए जाना जाता है
spq
आपूर्तिकर्ताओं को ज्ञात मात्रा में भागों की आपूर्ति करने के लिए जाना जाता है
वहाँ spq
संदर्भ नहीं होना चाहिए जहाँ संदर्भ हो sp
।
फिर परिणाम 'माइनस' रिलेशनल ऑपरेटर ( EXCEPT
स्टैंडर्ड SQL में कीवर्ड होने ) का उपयोग करके प्राप्त किया जा सकता है
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1' ),
( 'S2', 'P1' ),
( 'S3', 'P1' ) )
AS T ( sno, pno )
),
spq AS
( SELECT *
FROM ( VALUES ( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT sno
FROM spq
WHERE pno = 'P1'
EXCEPT
SELECT sno
FROM spq
WHERE pno = 'P1'
AND qty = 1000;
NOT IN
की एक श्रृंखला में परिवर्तित करने<> and
का अर्थ इस सेट में कुछ और नहीं है?