2011-09-09 15 views
7

हम .. इन दोनों तरीकों में एक ही परिणाम प्राप्त कर सकते हैंजो बेहतर है .. बाहरी शामिल हों या दाएं बाहरी शामिल हों?

Table_1 LEFT OUTER JOIN Table_2 

Table_2 RIGHT OUTER JOIN Table_1 

हम एक ही परिणाम क्यों सही उपयोग करने के लिए प्राप्त कर सकते हैं बाहरी में शामिल होने? इनमे से कौन बेहतर है ?

+7

'ए' और' बी' के योग के लिए, आप 'ए + बी' या' बी + ए 'कर सकते हैं। इनमे से कौन बेहतर है? –

+0

मुझे लगता है कि एक आधुनिक आरडीबीएमएस एक दूसरे को बदल सकता है और जो बेहतर प्रदर्शन करता है उसे चुन सकता है, इससे कोई फर्क नहीं पड़ता। –

उत्तर

13

के रूप में दूसरों को पहले ही बताया है LEFT OUTER JOIN और RIGHT OUTER JOIN बिल्कुल एक ही आपरेशन, उनके तर्कों उलट साथ छोड़कर कर रहे हैं। आपका प्रश्न यह पूछने जैसा है कि a < b या b > a लिखना बेहतर है या नहीं। वे वही हैं - यह सिर्फ वरीयता का मामला है।

ऐसा कहकर, मुझे लगता है कि ज्यादातर लोग LEFT JOIN से अधिक परिचित हैं और लगातार अपने एसक्यूएल में इसका उपयोग करते हैं। कुछ लोगों को भी एक प्रश्न के बीच में RIGHT JOIN अचानक अचानक पढ़ना मुश्किल लगता है, और इससे उन्हें रोकने और सोचने का कारण बनता है। तो मैं सुझाव दूंगा कि दो विकल्पों के बीच एक समान विकल्प दिया गया है, LEFT JOIN का उपयोग करना पसंद करते हैं। सुसंगत होने से अन्य डेवलपर्स के लिए आपके एसक्यूएल को समझना आसान हो जाएगा।

+3

यह टिप्पणियों में मेरे अतिरिक्त एक से बेहतर उदाहरण है। किसी कारण से, मैं एक साधारण ऑपरेटर पर रिक्त चित्रण कर रहा था जो सममित नहीं था :-) –

+4

हां। मुझे लगता है कि LEFT के लिए प्राथमिकता शायद प्राकृतिक झुकाव से सबसे अधिक "महत्वपूर्ण" तालिकाओं के साथ एक प्रश्न लिखना शुरू करने के लिए आती है, जिसमें अक्सर पूर्ण जानकारी होती है, यानी कोई पंक्तियां गायब नहीं होती हैं, और उन तालिकाओं को जोड़ती हैं जिनमें संबंधित जानकारी हो सकती है या नहीं उस। –

4

वे बराबर हैं, केवल वरीयता और पठनीयता की बात है। मैं इसे एक ही टेबल मानता हूँ?

+5

+1 और मेरा सुझाव है कि आप केवल वरीयता चुनें और इसके साथ चिपके रहें। यदि आप अपने बाहरी जुड़ने में सुसंगत हैं तो अंतिम परिणाम समान होना चाहिए। मैं यह भी सुझाव दूंगा कि यदि आप अनिश्चित हैं, तो बाएं बाहरी जुड़ने का उपयोग करें, क्योंकि अधिकांश लोग ऐसा करते हैं। – Dane

1

यह हमारी ज़रूरत पर निर्भर करता है - चाहे हमें बाएं टेबल या दाएं तालिका से सभी कॉलम चाहिए।

दोनों समान नहीं हैं।

+4

दोनों प्रश्नों में हमें तालिका_1 से सभी पंक्तियां मिलती हैं .. यानी एक ही परिणाम .. बीटीडब्लू यह होना चाहिए .. "चाहे" :) – Vaibhav

2

वाम बाहरी

जुड़ें एक छोड़ दिया बाहरी का परिणाम में शामिल होने के (या बस में शामिल होने के लिए छोड़ दिया) तालिका एक के लिए और बी हमेशा की तरह, "छोड़" तालिका (ए) के सभी रिकॉर्ड होता है यहां तक ​​कि अगर join- स्थिति को "दाएं" तालिका (बी) में कोई मिलान करने वाला रिकॉर्ड नहीं मिला है। इसका अर्थ यह है कि यदि ऑन क्लॉज बी में 0 (शून्य) रिकॉर्ड से मेल खाता है, तो भी शामिल होगा परिणाम में एक पंक्ति वापस आ जाएगी- लेकिन बी से प्रत्येक कॉलम में न्यूल के साथ इसका मतलब है कि एक बायां बाहरी जुड़ने से सभी मूल्यों को वापस लाता है छोड़ दिया मेज, प्लस

सही बाहरी (कोई मिलता-जुलता में शामिल होने के विधेय के मामले में या शून्य) मेल खाने वाले सही तालिका से मूल्यों के साथ जुड़ें

एक सही बाहरी में शामिल होने के बाद (या में शामिल होने) बारीकी से एक छोड़ दिया बाहरी में शामिल होने के जैसा दिखता है , तालिकाओं के उपचार को छोड़कर उलट दिया गया। "दाएं" तालिका (बी) से प्रत्येक पंक्ति कम से कम एक बार शामिल तालिका में दिखाई देगी। यदि "बाएं" तालिका (ए) से कोई मेल खाने वाली पंक्ति मौजूद नहीं है, तो उन रिकॉर्ड्स के लिए कॉलम में एएलएल दिखाई देगा जिनके पास बी में कोई मिलान नहीं है। एक सही बाहरी जुड़ाव सही तालिका से सभी मानों को लौटाता है और मिलान मूल्यों से मिलता है बाएं टेबल (कोई मिलान करने के मामले में न्यूल भविष्यवाणी में शामिल हों)।

http://en.wikipedia.org/wiki/Join_%28SQL%29

+2

हां, लेकिन मुझे लगता है कि ओपी पूछ रहा है कि सवाल यह है कि क्या एक बाएं बाहरी जॉइन बी है बी राइट आउटर जॉइन ए के समान (नोट * * टेबल * के साथ-साथ शामिल दिशा भी बदल दी गई है।) –

+0

मैं सिर्फ यह लिखना चाहता था कि वे कैसे काम करते हैं क्योंकि तब कोई यह समझ सकता है कि अगर कोई उन्हें उपयोग करता है तो वे अलग नहीं होते हैं प्रश्न और यह अधिक उपयोगी जानकारी है। –

+0

धन्यवाद @ reader_1000 मैं इस स्पष्टीकरण के बाद था :) – Jen

2

एसक्यूएल भाषा के डिजाइनर ठीक ही महसूस किया है कि सही पूर्वता के लिए छोड़ दिया लागू करने के मिलती भाषा (दुर्भाग्य से, वे स्तंभ आदेश के बारे में एक ही महसूस नहीं किया था!) ​​पर एक अनावश्यक बाधा होगा

वहाँ करता है लगता है यहां LEFT OUTER के लिए स्टैक ओवरफ्लो पर एक मजबूत वरीयता होने के लिए, जिस हद तक लोक पूरी तरह से बदल जाएगा, केवल LEFT (हमारे पास कल here था) का उपयोग करने में सक्षम होने के लिए।

कहें कि आपने मूल रूप से अपनी क्वेरी Table_2 INNER JOIN Table_1 में लिखा था इससे पहले कि आपको एहसास हुआ कि आपको वास्तव में Table_1 से सभी पंक्तियों को संरक्षित करने में बाहरी शामिल होना चाहिए। LEFT OUTER का उपयोग करने में सक्षम होने के लिए पूरे जुड़ने को बदलने के बजाय INNER से RIGHT OUTER को बदलने के लिए यह बहुत आसान होगा। सरल यहां अच्छा है क्योंकि यह कम आक्रामक है और इसलिए अनजाने में क्वेरी के इरादे को बदलने का कम जोखिम है।

एक और समान उदाहरण का उपयोग करने के लिए, संबंधपरक ऑपरेटर semi join पर विचार करें; संबंधपरक बीजगणित का हिस्सा होने के नाते, एक प्रौद्योगिकी को इसके बिना संबंधपरक रूप से पूर्ण नहीं माना जा सकता है। हालांकि मानक एसक्यूएल में सेमीफाइनल MATCH का अनुमान लगाता है, लेकिन यह व्यापक रूप से लागू नहीं होता है। हालांकि, अधिकांश एसक्यूएल उत्पाद विभिन्न कामकाज का समर्थन करते हैं। SELECT खंड में DISTINCT के साथ INNER JOIN के साथ INNER JOIN का उपयोग करने का सबसे आम दृष्टिकोण प्रतीत होता है और शामिल तालिका से विशेषताओं को छोड़ देता है। WHERE table_1.ID IN (SELECT ID FROM Table_2) का उपयोग करके इसका बारीकी से पालन किया जाता है। अगला सबसे लोकप्रिय WHERE EXISTS (SELECT * FROM Table_2 WHERE table_1.ID = table_1.ID) है।

बिंदु यह है कि उपर्युक्त सभी अर्ध जुड़ने वाले हैं जो जंगली में पाए जाते हैं। यद्यपि मेरी निजी वरीयता EXISTS का उपयोग करना है (हालांकि उत्सुकता से यह संबंधपरक गणक के करीब है), मुझे अभी भी दूसरों को अर्ध जुड़ने के रूप में पहचानने में सक्षम होना चाहिए; दिलचस्प बात यह है कि सबसे लोकप्रिय दृष्टिकोण (INNER JOIN प्लस DISTINCT प्लस गैर प्रक्षेपण) पहचानने के लिए सबसे कठिन हो सकता है!

किसी की व्यक्तिगत शैली को फिट करने के एकमात्र उद्देश्य के लिए कोड को रिफैक्टरिंग करना सही है: अनावश्यक प्रयासों की लागत, जोखिम में वृद्धि, स्रोत नियंत्रण के लिए निहितार्थ इत्यादि। अन्य प्राथमिकताओं को पहचानना और सम्मान करना सीखना एक महत्वपूर्ण कौशल है: यदि आपको लगता है खुद को समझने में सक्षम होने के बाद खुद को दोबारा प्रतिक्रिया देना आप खुद को नुकसान पहुंचाएंगे।

बेशक, तर्कसंगत रूप से, 'सही' उत्तर बाहरी जोड़ों से पूरी तरह से बचने के लिए है। रिलेशनल मॉडल में नल जैसी कोई चीज नहीं है और बाहरी जॉइन स्पष्ट रूप से नल का उत्पादन करने के लिए डिज़ाइन किए गए हैं।

संबंधित मुद्दे