2013-04-20 11 views
8

से कम पंक्तियों में परिणामों में शामिल होने के बावजूद मैं SQL सर्वर का उपयोग कर रहा हूं (मुझे विश्वास है कि यह 2005 है)।एसक्यूएल सर्वर: बाएं तालिका

मेरे पास TableA है जिसमें 2 कॉलम और 43 9 पंक्तियां हैं (प्रत्येक पंक्ति अद्वितीय है)।

+----------+ 
|ID | Name | 
+----------+ 

मैं TableB कि 35 कॉलम और हजार पंक्तियों के कई सैकड़ों (प्रत्येक पंक्ति भी अद्वितीय है) है।

+------------------------------------------------------------------------------+ 
|Date | ID | Name | Blah1 | Blah2 | ... | Hour1 | Hour2 | Hour3 | ... | Hour24 | 
+------------------------------------------------------------------------------+ 

TableB में प्रत्येक पंक्ति में प्रति घंटा अवलोकन और कुछ अन्य घर की जानकारी है। अब परीक्षण उद्देश्यों के लिए मुझे केवल आज की तारीख में दिलचस्पी है I.e 4/19/2013।

अगर मैं कार्य करें:

Select count(*) 
from TableB 
where Date = '4/19/2013 12:00:00 AM' 

मैं 10526 है, जो सही है के रूप में वहाँ 10526 अलग स्थानों जिसके लिए वहाँ है प्रति घंटा अवलोकन डेटा प्रत्येक दिन कर रहे हैं मिलता है।

मैं टेबल ए और टेबलबी on a.id = b.id में शामिल होना चाहता हूं, जिसके परिणामस्वरूप 43 9 पंक्तियां होंगी।

दुर्भाग्यवश, परिणाम 246 पंक्तियां हैं। यह कैसे हो सकता है? LEFT JOINTableA में सभी पंक्तियों को वापस करने का मानना ​​है कि TableB में कोई मिलान था या नहीं?

* संपादित *

पूरा क्वेरी मैं इस्तेमाल किया था:

select * 
from TableA as a 
left join TableB as b on a.id = b.id 
where RealDate = '4/20/2013 12:00:00 AM' 
+3

क्या आप – PSR

+0

@PSR का उपयोग करने वाली पूरी क्वेरी दिखा सकते हैं - मैंने मूल क्वेरी को शामिल करने के लिए अपनी मूल पोस्ट संपादित की है। – codingknob

+0

पुन: वाक्यांश @LoztInSpace मूल्यवान टिप्पणी: जॉइन से पहले चयन तालिकाओं में बाधाएं जोड़ें (WHERE का उपयोग करें)। अन्यथा, ये बाधाएं जुड़ने के परिणामी आउटपुट पर कार्य करती हैं (और पंक्तियों को मूल सारणी से भी कम तक कम कर सकती हैं)। –

उत्तर

17

इस प्रयास करें:

select * from TableA as a 
left join (SELECT * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b 
on a.id = b.id 

या इस:

select * from TableA as a 
left join TableB as b on (a.id = b.id AND RealDate = '4/20/2013 12:00:00 AM') 
+0

यह चाल है। धन्यवाद। मैं एसक्यूएल के लिए नौसिखिया हूं इसलिए पता नहीं था कि इस मामले में जहां खंड इस तरह का बड़ा अंतर करेगा। मैं उत्सुक हूं हालांकि वास्तव में मेरी मूल क्वेरी क्या कर रही थी। अगर यह समझ में नहीं आया कि 246 पंक्तियों का नतीजा क्या था? – codingknob

+2

इसलिए, आपकी क्वेरी ने पहले बाईं ओर शामिल किया था, उसके बाद यह परिणाम कहां से फ़िल्टर करता है। उम्मीद है कि यह समझ में आता है। यदि यह नहीं है तो मैं और विस्तार कर सकता हूं। – faisal

+0

क्या हुआ था कि मेरी मूल क्वेरी उन पंक्तियों को 'केवल' लौटा दी गई है जहां a.ID = b.ID, जो 'LEFT' में शामिल होने के दर्शन का पालन नहीं करता था। यह अजीब है। लेकिन मैं इसे स्वीकार करूंगा और आगे बढ़ूंगा क्योंकि आपका समाधान सही है और मेरी समस्या हल करता है। धन्यवाद। इसकी प्रशंसा करना। – codingknob

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