2013-04-20 8 views
8

Używam programu SQL Server (uważam, że jest 2005).Serwer SQL: lewe sprzężenie wyników w mniejszej liczbie wierszy niż w lewej tabeli

Mam TableA, który ma 2 kolumny i 439 wierszy (każdy wiersz jest unikalny).

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

mam TableB że ma 35 kolumn i setki tysięcy wierszy (każdy wiersz jest również unikalne).

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

Każdy wiersz w TableB ma uwag godzinowych i kilka innych domów przechowywania informacji. Teraz do celów testowych interesuje mnie dzisiejsza data, tj. 4/19/2013.

Jeśli zrobić:

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

uzyskać 10526, która jest poprawna, ponieważ istnieją różne lokalizacje 10526, dla których dostępne są dane obserwacyjne godzinowe każdy dzień.

Chcę LEWY DOŁĄCZ DO TableA i TableB on a.id = b.id, który POWINIEN stworzyć wynik, który ma 439 wierszy.

Niestety wynik ma 246 wierszy. Jak to może być? Czy nie ma potrzeby, aby LEFT JOIN zwracać wszystkie wiersze w TableA niezależnie od tego, czy było dopasowanie w TableB?

* EDIT *

Kompletny zapytania Kiedyś było:

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

możesz wyświetlić pełne zapytanie, którego użyłeś – PSR

+0

@PSR - Edytowałem mój oryginalny wpis, aby uwzględnić pierwotne zapytanie. – codingknob

+0

Re-phrasing @LoztInSpace precious comment: Dodaj ograniczenia (używając WHERE) do tabel wyboru przed JOIN. W przeciwnym razie ograniczenia te działają na wynikowy wynik sprzężeń (i mogą zmniejszyć liczbę wierszy nawet do mniejszej niż oryginalne tabele). –

Odpowiedz

17

Spróbuj tego:

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 

albo to:

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

To wystarczyło. Dziękuję Ci. Jestem początkującym dla SQL, więc nie wiedziałem, że umieszczenie klauzuli where w tym przypadku spowodowałoby tak dużą różnicę. Ciekawi mnie jednak to, co wtedy robiła moja pierwotna kwerenda. Jeśli nie ma sensu, o co chodzi w 246 rzędach? – codingknob

+2

, więc zapytanie najpierw było lewostronne, po czym odfiltruje wynik przez klauzulę where. Mam nadzieję, że to ma sens. Jeśli nie, mogę rozwinąć więcej. – faisal

+0

co się stało, to że moje pierwotne zapytanie zwróciło 'TYLKO 'te wiersze, w których a.ID = b.ID, które nie były zgodne z filozofią łączenia" LEFT ". To dość dziwne. Ale zaakceptuję to i pójdę dalej, ponieważ twoje rozwiązanie jest poprawne i rozwiązuje mój problem. Dziękuję Ci. Doceniam to. – codingknob

Powiązane problemy