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'
możesz wyświetlić pełne zapytanie, którego użyłeś – PSR
@PSR - Edytowałem mój oryginalny wpis, aby uwzględnić pierwotne zapytanie. – codingknob
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). –