यह काफी आसान है, जब आप इसे समझ लेते हैं:
SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND S.S_Id NOT IN(SELECT e.S_Id -- take this line
FROM ENROLLMENT e
WHERE e.Mark < 70);
वह पंक्ति मूल रूप से S.S_Id
. की तुलना करती है सभी e.S_Id
. के साथ सबक्वेरी से आने वाले मान।
अब इसे NOT EXISTS
. में बदलें और समानता जांच S.S_Id = e.S_Id
. लगाएं , सबक्वेरी के अंदर:
SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND NOT EXISTS (SELECT e.S_Id
FROM ENROLLMENT e
WHERE (e.Mark < 70) -- if this is complex, you'll need parentheses
AND S.S_Id = e.S_Id);
मामूली संभावित परिवर्तन यह महसूस करना है कि (SELECT e.S_Id ...
वास्तव में e.S_Id
. की आवश्यकता नहीं है . EXISTS
के साथ उपश्रेणियां और NOT EXISTS
बस जांचें कि क्या पंक्तियाँ वापस आ गई हैं या नहीं और स्तंभ मान कोई मायने नहीं रखते हैं। आप SELECT *
. डाल सकते हैं या एक स्थिरांक (SELECT 1
आम है) या SELECT NULL
या यहां तक कि SELECT 1/0
(हाँ, यह काम करेगा!):
SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND NOT EXISTS (SELECT 1
FROM ENROLLMENT e
WHERE e.Mark < 70
AND S.S_Id = e.S_Id);
एक अन्य प्रमुख विचार यह है कि जब आप इस तरह से रूपांतरण करते हैं, तो (प्रतीत होता है समकक्ष) NOT EXISTS
और NOT IN
किसी प्रश्न का लेखन वास्तव में केवल तभी समतुल्य होता है जब दोनों S_Id
कॉलम अशक्त नहीं हैं। अगर e.S_Id
कॉलम अशक्त है, NOT IN
पूरी क्वेरी के परिणामस्वरूप कोई पंक्तियाँ वापस नहीं आ सकती हैं (क्योंकि x NOT IN (a, b, c, ...)
x<>a AND x<>b AND ...
. के बराबर है और वह शर्त सच नहीं हो सकती जब a,b,c...
. में से कोई एक है NULL
।)
इसी तरह के कारणों से, यदि s.S_Id
. है तो आपके अलग-अलग परिणाम होंगे अशक्त है (इस मामले में इसकी बहुत संभावना नहीं है क्योंकि यह शायद प्राथमिक कुंजी है लेकिन अन्य मामलों में यह मायने रखता है।)
इसलिए NOT EXISTS
. का उपयोग करना लगभग हमेशा बेहतर होता है , क्योंकि यह अलग तरह से व्यवहार करता है, भले ही कोई भी कॉलम अशक्त हो (S.S_Id = e.S_Id
check पहले पंक्तियों को अशक्त के साथ छोड़ देगा) और आमतौर पर यह व्यवहार वांछित है। प्रश्न में कई विवरण हैं: NOT IN बनाम NOT EXISTS
, @Martin Smith द्वारा उत्तर में। आपको NOT IN
. को कन्वर्ट करने के तरीके भी मिलेंगे करने के लिए NOT EXISTS
और शून्य से संबंधित (अप्रिय) व्यवहार रखें।