यह दे रहा है आप, अंतर नहीं दिखाई देगा का स्वभाव है एक बाहरी जुड़ाव (इस मामले में एक बाएं शामिल)। बाएं जॉइन में आपकी मुख्य तालिका (ग्राहक) होती है, जो इसे शामिल तालिका (ऑर्डर) के मानदंड से मेल खाती है। उन ग्राहकों में प्रत्येक पंक्ति के लिए जिनके पास कोई मिलान नहीं है, आंतरिक जुड़ने के विपरीत, यह पंक्ति को नहीं हटाता है। इसके बजाए, यह ऑर्डर से सभी फ़ील्ड जोड़ता है लेकिन उनमें शून्य डालता है। इस उदाहरण को
देखो:
Table A Table B
┌──────┬──────┐ ┌──────┬──────┐
│field1│field2│ │field3│field4│
├──────┼──────┤ ├──────┼──────┤
│A │1 │ │1 │One │
│B │2 │ │3 │Three │
│C │3 │ └──────┴──────┘
└──────┴──────┘
टेबल 'आंतरिक (field2 के बीच और फ़ील्ड 3) है में शामिल होने:
┌──────┬──────┬──────┬──────┐
│field1│field2│field3│field4│
├──────┼──────┤──────┼──────┤
│A │1 │1 │One │
│C │3 │3 │Three │
└──────┴──────┴──────┴──────┘
लेकिन तालिकाएं' बाहरी में शामिल होने आप हर रिकॉर्ड देने के लिए है, और यदि कोई मैच नहीं है, तो इसके बजाय नल डालें।
┌──────┬──────┬──────┬──────┐
│field1│field2│field3│field4│
├──────┼──────┤──────┼──────┤
│A │1 │1 │One │
│B │2 │NULL │NULL │⬅︎ No match
│C │3 │3 │Three │
└──────┴──────┴──────┴──────┘
अब अगर वहाँ table2 में कोई मिलान बिल्कुल रहे हैं तो क्या होगा? उदाहरण के लिए, यदि आपने ऑन क्लॉज में एक असंभव स्थिति जोड़ा है? फिर परिणाम में सभी रिकॉर्ड "कोई मैच"
┌──────┬──────┬──────┬──────┐
│field1│field2│field3│field4│
├──────┼──────┤──────┼──────┤
│A │1 │NULL │NULL │⬅︎ No match (because of impossible condition)
│B │2 │NULL │NULL │⬅︎ No match (because of impossible condition)
│C │3 │NULL │NULL │⬅︎ No match (because of impossible condition)
└──────┴──────┴──────┴──────┘
कैसा लगेगा अगर कोई मैच था क्योंकि वहाँ की गई ID वाला तालिका 2 में कोई रिकॉर्ड नहीं था, या अगर कोई था नहीं तो यह कोई फर्क नहीं पड़ता मैच क्योंकि आपने एक असंभव स्थिति जोड़ दी है। बाहरी जुड़ने का नतीजा यह है कि फ़ील्ड जो टेबल 2 से आते थे उन्हें नल के साथ बदल दिया जाएगा। क्योंकि इस तरह बाहरी जुड़ाव परिभाषित किया जाता है।
अब असली दुनिया तालिकाओं के लिए:
आप वास्तव में आदेश जिसका OrderID रिक्त है में किसी भी रिकॉर्ड नहीं है (जब तक आप यह बहुत बुरी तरह से तैयार किया गया है)। इसलिए यदि आप उस शर्त को ऑन क्लॉज में डालते हैं, तो उसे आपके मानदंडों को पूरा करने वाले कोई रिकॉर्ड नहीं मिलेगा।
ऐसे मामले में, क्योंकि यह एक बाहरी (बाएं) शामिल है, इसलिए आप सभी मूल ग्राहक रिकॉर्ड प्राप्त करते हैं, और क्योंकि कोई मिलान नहीं होता है, उनमें से प्रत्येक के पास ऑर्डर से सभी शून्य होते हैं।
यदि आप WHERE
में स्थिति डालते हैं, तो आप वास्तव में बाएं शामिल होने के इस व्यवहार का अच्छा उपयोग कर रहे थे। आप प्रत्येक ग्राहक से अपने आदेश के साथ मेल खाते थे। यदि कोई मैच था - ठीक है, तो आपको वास्तविक ऑर्डर आईडी मिल गई है। लेकिन मामलों में कोई मिलान नहीं था - जिन्हें आप ढूंढ रहे हैं - यह एक शून्य ऑर्डर आईडी जोड़ता है।
जहां खंड तब आपको केवल रिकॉर्ड देता है जहां यह हुआ था। यही वह रिकॉर्ड है जो ऑर्डर में मिलान करने वाला आदेश नहीं था।
मैं सहजता से समझता हूं कि आप ऐसा क्यों सोचेंगे, लेकिन मुझे लगता है कि कारण यह है कि 'ऑन' का उपयोग किसी दिए गए शर्त पर तालिकाओं में शामिल होने के लिए किया जाता है। आप जो करने की कोशिश कर रहे हैं वह पंक्तियों की तलाश है जहां एक शर्त सच है। मुझे नहीं पता कि यह सच के करीब कहीं भी है, लेकिन इस तरह मैं इसके बारे में सोचने आया हूं और जानता हूं कि इसका उपयोग कब किया जाए। – AdamMc331
एंड ओ। ऑर्डर आईडी वह है जो इसे गड़बड़ कर रहा है। जब तक यह और .... स्थिति को हिट नहीं करता तब तक यह सही तरीके से काम करेगा। – rvphx