2014-10-28 9 views
5

इस सरल एसक्यूएल बाहरी में शामिल होने के बारे में क्या गलत है?बी में एक बाएं बाहरी कैसे शामिल हो सकता है ए में से अधिक पंक्तियों की तुलना में?

select count(*) from A -- 25766 
select count(*) from B -- 1242 
select count(*) from A left outer join B on A.b = B.b -- 310176 

क्रमशः 25766, 1242 और 310176 पंक्तियां लौटाएं। (यह माइक्रोसॉफ्ट एसक्यूएल सर्वर 2012 के लिए है।) A left outer join BA में मौजूद होने की तुलना में अधिक पंक्तियों को वापस कैसे कर सकता है, विशेष रूप से this वेन आरेख दिया गया है? मुझे लगता है कि मैं एक बेवकूफ गलती कर रहा हूं लेकिन यह क्या है?

+2

यह स्तंभ हो सकता है देता है: यह तालिका एक में एक पंक्ति है कि तालिका बी उदाहरण में कई पंक्तियों से मेल खाता होना संभव नहीं है बी पूरी कुंजी नहीं है? – Jens

+0

+1 मैं जांच करूंगा। यह 310176 कैसे समझा सकता है? – Drux

+2

यदि बी केवल कुंजी का हिस्सा है तो यह हो सकता है कि संदर्भ में एक पंक्ति बी में बहुत अधिक पंक्तियां और यदि आपके उदाहरण में 1 संदर्भ 12,0 का रिकॉर्ड ... बी में पंक्तियां आपको अपना परिणाम मिलती हैं। – Jens

उत्तर

14

यह तब हो सकता है जब कॉलम b तालिका B में अद्वितीय नहीं है। मान लीजिए आपके पास यह डेटा:

 
    A  B 
+---+ +---+---+ 
| b | | b | c | 
+---+ +---+---+ 
| 1 | | 2 | 1 | 
| 2 | | 2 | 2 | 
+---+ +---+---+ 

जब आप स्तंभ b पर B करने के लिए A से बाएं में शामिल होने के लिए, आप

 
+-----+------+------+ 
| A.b | B.b | B.c | 
+-----+------+------+ 
| 1 | NULL | NULL | 
| 2 | 2 | 1 | 
| 2 | 2 | 2 | 
+-----+------+------+ 

जो कुल में तीन पंक्तियों देता है यहां तक ​​कि दोनों A और B केवल है, हालांकि मिल प्रत्येक पंक्ति दो पंक्तियां।

+0

+1 हां, 'बी' रिटर्न 1 9 7, और 1 9 7 << 1242 से गिनती (विशिष्ट बी) का चयन करें। – Drux

3

इसके बारे में कुछ भी अजीब बात नहीं है (और यह स्थिति आंतरिक जोड़ों पर भी लागू होती है)। एक बाएं बाहरी में शामिल होने:

  • रिटर्न सभी पंक्तियों एक क्रॉस बी जहां हालत मैच में शामिल होने
  • और एक जहां हालत में शामिल होने से सभी पंक्तियों रिटर्न से न्यूनतम क्वेरी में तो

से मेल नहीं खाता 25766 पंक्तियों को वापस कर देगा लेकिन और भी हो सकता है।

A    B    Result 
+----+----+ +-----+----+ +------+-----+-----+------+ 
| id| b| | id| b| | a.id| a.b| b.b| b.id| 
+----+----+ +-----+----+ +------+-----+-----+------+ 
| 1| 10| | 123| 10| |  1| 10| 10| 123| 
+----+----+ | 456| 10| |  1| 10| 10| 456| 
      +-----+----+ +------+-----+-----+------+ 

यह दो पंक्तियों भले ही है तालिका ए में एक पंक्ति

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