Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

NOT IN को EXISTS में नहीं बदलना

यह काफी आसान है, जब आप इसे समझ लेते हैं:

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 और शून्य से संबंधित (अप्रिय) व्यवहार रखें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle ucp में oracle.ucp.jdbc.PoolDataSourceFactory नहीं खोजा जा सका

  2. मैं Oracle Varchar2 में बाइट्स कैसे स्टोर कर सकता हूं, और ASCII को टेक्स्ट के रूप में माना जाता है

  3. नकली OLAP

  4. JDBC:Oracle एप्लिकेशन सर्वर और नेटवर्क एडेप्टर कनेक्शन त्रुटि स्थापित नहीं कर सके

  5. सी # का उपयोग कर एक .SQL स्क्रिप्ट फ़ाइल को कैसे निष्पादित करें