इस कार्य के लिए मूल रूप से 4 तकनीकें हैं, ये सभी मानक SQL हैं।
NOT EXISTS
पोस्टग्रेज में अक्सर सबसे तेज।
SELECT ip
FROM login_log l
WHERE NOT EXISTS (
SELECT -- SELECT list mostly irrelevant; can just be empty in Postgres
FROM ip_location
WHERE ip = l.ip
);
इस पर भी विचार करें:
- EXISTS सबक्वेरी में क्या पढ़ना आसान है?
LEFT JOIN / IS NULL
कभी-कभी यह सबसे तेज़ होता है। अक्सर सबसे छोटा। अक्सर एक ही क्वेरी योजना में परिणाम होता है NOT EXISTS
।
SELECT l.ip
FROM login_log l
LEFT JOIN ip_location i USING (ip) -- short for: ON i.ip = l.ip
WHERE i.ip IS NULL;
EXCEPT
छोटा। अधिक जटिल प्रश्नों में आसानी से एकीकृत नहीं है।
SELECT ip
FROM login_log
EXCEPT ALL -- "ALL" keeps duplicates and makes it faster
SELECT ip
FROM ip_location;
ध्यान दें कि (प्रति दस्तावेज़):
<ब्लॉककोट>
जब तक EXCEPT ALL
. डुप्लीकेट हटा दिए जाते हैं उपयोग किया जाता है।
आमतौर पर, आपको ALL
चाहिए खोजशब्द। यदि आप परवाह नहीं करते हैं, तब भी इसका उपयोग करें क्योंकि यह क्वेरी को तेज़ बनाता है ।
NOT IN
केवल NULL
के बिना ही अच्छा है मान या यदि आप NULL
को संभालना जानते हैं अछि तरह से। मैं नहीं होता इस उद्देश्य के लिए इसका इस्तेमाल करें। साथ ही, बड़ी तालिकाओं के साथ प्रदर्शन खराब हो सकता है।
SELECT ip
FROM login_log
WHERE ip NOT IN (
SELECT DISTINCT ip -- DISTINCT is optional
FROM ip_location
);
NOT IN
NULL
. के लिए एक "ट्रैप" वहन करता है दोनों तरफ के मान:
- ऐसे रिकॉर्ड ढूंढें जहां जॉइन मौजूद नहीं है
MySQL पर लक्षित dba.SE पर समान प्रश्न:
- उन पंक्तियों का चयन करें जहां पहले कॉलम में दूसरे कॉलम का मान मौजूद नहीं है