कुछ सबक्वेरी (विशेषकर NOT IN टाइप) को LEFT JOIN में बदलकर बेहतर प्रदर्शन और NULL हैंडलिंग प्राप्त कर सकते हैं।
उदाहरण टेबल्स:
-- customers
+-------------+----------+
| Customer_Id | Name |
+-------------+----------+
| 1 | Rahul |
| 2 | Yashpal |
| 3 | Gaurav |
| 4 | Virender |
+-------------+----------+
-- reserve
+------+------------+
| ID | Day |
+------+------------+
| 1 | 2017-12-30 |
| 2 | 2017-12-28 |
| 2 | 2017-12-25 |
| 1 | 2017-12-24 |
| 3 | 2017-12-26 |
+------+------------+
मूल सबक्वेरी - बुकिंग न करने वाले ग्राहक:
mysql> Select Name from customers
-> where customer_id NOT IN (Select id From reserve);
+----------+
| Name |
+----------+
| Virender |
+----------+
LEFT JOIN में रूपांतरण चरण:
- सबक्वेरी की टेबल (
Reserve) कोFROMक्लॉज में लाएं औरLEFT JOINकरें WHEREक्लॉज केINएक्सप्रेशन को दोनों टेबल के ID कॉलम की सीधी तुलना में बदलेंWHEREमेंReserveटेबल के कॉलमIS NULLशर्त जोड़ें
परिवर्तित क्वेरी:
mysql> SELECT Name from customers
-> LEFT JOIN reserve ON customer_id = Id
-> WHERE Id IS NULL;
+----------+
| Name |
+----------+
| Virender |
+----------+
1 row in set (0.00 sec)
क्यों LEFT JOIN बेहतर?
NOT INNULL मानों के साथ अप्रत्याशित व्यवहार करता है (यदि सबक्वेरी NULL लौटाए तो कोई परिणाम नहीं)LEFT JOIN ... WHERE ... IS NULLNULL-सेफ है- अक्सर बेहतर क्वेरी प्लान और इंडेक्स उपयोग
- एंटी-जॉइन पैटर्न का मानक SQL तरीका
नोट: NOT IN के बजाय NOT EXISTS भी अच्छा विकल्प है (NULL-सेफ और अक्सर तेज)।