SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
FROM reservation_log
WHERE change_type = 'cancel')
या:
SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL
पहला संस्करण अधिक सहज है, लेकिन मुझे लगता है कि दूसरे संस्करण को आमतौर पर बेहतर प्रदर्शन मिलता है (यह मानते हुए कि आपके पास शामिल होने में उपयोग किए गए कॉलम पर इंडेक्स हैं)।
दूसरा संस्करण काम करता है क्योंकि LEFT JOIN
पहली तालिका में सभी पंक्तियों के लिए एक पंक्ति देता है। जब ON
शर्त सफल होती है, उन पंक्तियों में दूसरी तालिका के कॉलम शामिल होंगे, जैसे INNER JOIN
. जब शर्त विफल हो जाती है, तो लौटाई गई पंक्ति में NULL
होगा दूसरी तालिका के सभी स्तंभों के लिए। WHERE l.id IS NULL
test फिर उन पंक्तियों से मेल खाता है, इसलिए यह उन सभी पंक्तियों को ढूंढता है जिनका तालिकाओं के बीच कोई मेल नहीं है।