आपको एक बेहतर समझ हासिल करने की आवश्यकता है कि LEFT JOIN कैसे काम करता है (बाहरी जोड़ सामान्य रूप से - बाएँ/दाएँ और पूर्ण [बाहरी] जुड़ते हैं)
बायाँ जॉइन हमेशा दो चरणों में किया जाता है:
SELECT ....
FROM table1
LEFT JOIN table1 ON join_conditions
WHERE where_conditions
चरण 1 - LEFT JOIN पहले किया जाता है (दो तालिकाओं में शामिल होने के लिए ON क्लॉज में निर्दिष्ट शर्तों का उपयोग करके)
चरण 2 - चरण 1 में शामिल होने से उत्पन्न परिणाम पर WHERE की शर्तें लागू होती हैं
लेफ्ट जॉइन कैसे काम करता है - एक त्वरित रिमाइंडर:लेफ्ट जॉइन हमेशा लेफ्ट टेबल से सभी पंक्तियों को लौटाता है, यहां तक कि इन पंक्तियों के लिए जिनका दायां टेबल में कोई मेल नहीं है। जब कोई मिलान नहीं होता है (ऑन कंडीशन का मूल्यांकन गलत होता है), लेफ्ट जॉइन राइट टेबल के लिए NULLs लौटाता है। लेफ्ट जॉइन के रूप में।
इसलिए यदि आपके पास यह प्रश्न है:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
WHERE H.STATUS='COMPLETED'
डेटाबेस पहले लेफ्ट जॉइन करता है, जो है:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
उपरोक्त क्वेरी निम्नलिखित परिणाम देती है (निष्क्रिय पक्ष पर अंतिम 3 पंक्तियों में NULLs देखें):
| S.GROUP | S.TABLE_ID | H.RUN_DATE | H.STATUS |
|-----------|------------|----------------------------|-----------|
| Sales | 1210 | January, 05 2016 00:00:00 | COMPLETED |
| Sales | 1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | March, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | January, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | March, 05 2016 00:00:00 | COMPLETED |
| Sales | 1245 | (null) | (null) |
| Reference | 1650 | (null) | (null) |
| Sales | 1784 | (null) | (null) |
और फिर डेटाबेस उपरोक्त परिणाम सेट पर WHERE शर्त निष्पादित करता है:
WHERE H.STATUS='COMPLETED'
चूंकि NULL='COMPLETED'
FALSE का मूल्यांकन करता है, तो क्वेरी का अंतिम परिणाम होता है:
| GROUP | TABLE_ID | RUN_DATE | STATUS |
|-----------|----------|----------------------------|-----------|
| Sales | 1210 | January, 05 2016 00:00:00 | COMPLETED |
| Sales | 1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | March, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | January, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | March, 05 2016 00:00:00 | COMPLETED |
वह है:सभी NULLs छोड़ दिए गए थे।
यह डेमो देखें:http://sqlfiddle .com/#!9/e2ed0/3
यदि आप NULL मानों के साथ भी रिकॉर्ड प्राप्त करना चाहते हैं, तो आपको इस स्थिति को इसमें बदलना होगा:
WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )
आप WHERE क्लॉज से ths कंडीशन को भी हटा सकते हैं, और इसे LEFT JOIN की ON कंडीशन में जोड़ सकते हैं, यानी:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON ( S.TABLE_ID=H.TABLE_ID AND H.STATUS='COMPLETED' )
इस डेमो में अंतिम क्वेरी देखें:http://sqlfiddle.com/#!9/e2ed0 /3