2010-12-14 13 views
5

संभव डुप्लिकेट:
(self,left outer,right outer,full outer) join - real world examplesबाएं, दाएं, अंदरूनी और बाहरी जॉइन के बीच क्या अंतर है?

हैलो, प्रिय अतः समुदाय!

मैं कुछ समय के लिए SQL डेटाबेस के साथ काम कर रहा हूं लेकिन एक पहलू अभी भी मेरे लिए बहुत भ्रमित है - तालिका में शामिल हो जाता है। मैं बहुत स्पष्ट रूप से समझता हूं कि जब मैं एक बहु-टेबल क्वेरी लिखता हूं, लेकिन जब कोई जॉइन खेलता है, तो मुझे लगता है कि मुझे कुछ भी समझ में नहीं आता है।

कृपया मुझे यह समझने में सहायता करें कि तालिका में क्या शामिल है, और बाएं, दाएं, INNER और बाहरी जॉइन के बीच क्या अंतर है? एक आत्म में शामिल क्या है?

अगर आप इस सरल तालिका संरचना में उनके उपयोग का एक उदाहरण प्रदान कर सकता है मैं आभारी होंगे: लेखकों

id |name 
--------------- 
1 |John 
2 |Bob 
3 |Richard 

टेबल किताबें

id |author_id |title  |rating 
----------------------------------------- 
1 |1   |book A  |5 
2 |1   |book B  |4.8 
3 |3   |book C  |3 

धन्यवाद

टेबल आप!

+0

मैंने उस सटीक प्रश्न को गुमराह किया और मतभेदों को दर्शाने वाले सामने वाले पृष्ठ पर कई हिट के साथ आ गया। यहां पूछने से तेज हो सकता है। हालांकि ईमानदार होने के लिए, जब मैं खुद से जुड़ने के लिए जाता हूं तो मुझे आमतौर पर अपनी याददाश्त ताज़ा करना पड़ता है! – DarinH

+1

"मैं बहुत स्पष्ट रूप से समझता हूं, क्या होता है, जब मैं एक बहुमूल्य क्वेरी लिखता हूं, लेकिन जब कोई जॉइन खेलता है, तो मुझे लगता है कि मैं कुछ भी समझ नहीं पा रहा हूं।" है ना? मल्टीटेबल प्रश्न लिखते समय एक जुड़ाव खेल में होता है, आप अंतर्निहित शामिल वाक्यविन्यास का उपयोग नहीं कर रहे हैं (आप टेबल के बीच कॉमा के साथ) हैं? यदि ऐसा है, तो उस सीमित और बहुत खराब वाक्यविन्यास का उपयोग करके कभी भी कोड का एक और टुकड़ा न लिखें। यदि आप उस गरीब वाक्यविन्यास का उपयोग करते हैं तो इसमें कोई आश्चर्य की बात नहीं है कि आप शामिल नहीं हैं। – HLGEM

+0

एचएलजीईएम, यह पुराना और गरीब क्यों है? –

उत्तर

3

देखें एक {प्रकार में शामिल होने} बी से {स्थिति से जुड़ें}

इनर: केवल परिणाम दिखाई देंगे जहां में शामिल होने हालत सच है। यदि ए पर पंक्ति के लिए कोई वास्तविक स्थिति नहीं है, तो इसे परिणामों से निकाल दिया जाएगा।

वाम: से एक है कि एक मिलान नहीं है

बाहरी बी पर शामिल होने पंक्तियों को फ़िल्टर कर देगा: से एक है कि एक मिलान नहीं है बी

अधिकार पर शामिल होने पंक्तियों को फ़िल्टर नहीं होगा छोड़ दिया और सही जुड़ने को बाहरी जोड़ों के रूप में माना जाता है जहां आंतरिक आंतरिक शामिल होता है।

3

इनर शामिल हों:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    INNER JOIN books b ON 
     a.id = b.author_id 

इस में परिणाम होगा:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
3 |Richard |3 |3   |book C  |3 

सूचना है कि Bob नहीं दिखाया गया था - एक inner join हमेशा आइटम है कि दोनों स्रोतों में मौजूद नहीं हैं निकालता है (मापदंड में शामिल होने पर विचार ; हमारे मामले में a.id = b.author_id

वाम शामिल हों:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    LEFT JOIN books b ON 
     a.id = b.author_id 

इस में परिणाम होगा:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
2 |Bob  |null |null  |null  |null 
3 |Richard |3 |3   |book C  |3 

अब सभी लेखकों दिखाए जाते हैं - एक LEFT JOIN (या LEFT OUTER JOIN, यह एक ही है) सभी "छोड़" रिकॉर्ड रखना होगा (लेखक) और "दाएं" रिकॉर्ड्स को प्रतिस्थापित करेंगे जो शून्य के साथ नहीं पाए जाते हैं।

"सही जुड़ता है" के बारे में - यह "बाएं जुड़ता है" जैसा ही है, लेकिन एक व्यस्त संबंध के साथ। निम्न क्वेरी पिछले एक के रूप में ही रिकॉर्ड परिणाम होगा (ध्यान दें कि टेबल एक उलटा क्रम में हैं, सही के उपयोग क्षतिपूर्ति करने के लिए शामिल हो):

SELECT 
    a.*, 
    b.* 
FROM 
    books b 
    RIGHT JOIN authors a ON 
     a.id = b.author_id 

आशा है कि यह अब स्पष्ट है।

पीएस: FULL OUTER JOIN भी है। बाएं और दाएं संयुक्त में शामिल होने के बारे में सोचें - अगर लेखक के बिना किताबें थीं तो वे पूर्ण बाहरी शामिल होने पर भी दिखाए जाएंगे।

+0

इसे प्यार करें। यह तस्वीर को इतनी स्पष्ट रूप से चित्रित करता है। –

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