वहाँ मूलतः कि करने के लिए 3 तरीके हैं: not exists
, not in
और left join / is null
।
बाईं तरफ के साथ है
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
अंदर नही
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
मौजूद नहीं
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
इनमे से कौन बेहतर है? इस प्रश्न का उत्तर प्रमुख विशिष्ट RDBMS विक्रेताओं के लिए तोड़ा जा सकता है। सामान्यतया, select ... where ... in (select...)
जब उप-क्वेरी में रिकॉर्ड की संख्या का परिमाण अज्ञात होता है, तो इसका उपयोग करने से बचना चाहिए । कुछ विक्रेता आकार सीमित कर सकते हैं। उदाहरण के लिए, ओरेकल, एक है सीमा 1,000 है । सबसे अच्छी बात यह है कि तीनों को आज़माकर निष्पादन योजना को दिखाया जाए।
विशेष रूप से PostgreSQL, निष्पादन योजना के रूप NOT EXISTS
और LEFT JOIN / IS NULL
समान हैं। मैं व्यक्तिगत रूप से NOT EXISTS
विकल्प पसंद करता हूं क्योंकि यह इरादे को बेहतर दिखाता है। आखिरकार अर्थ यह है कि आप ए में रिकॉर्ड ढूंढना चाहते हैं कि बी में इसका पीके मौजूद नहीं है ।
पुराना लेकिन फिर भी सोना, पोस्टग्रैडक्यूएल के लिए विशिष्ट है, हालांकि: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresl/