Lewy SQL Dołącz utratę wierszy po filtrowaniu
Mam połączenie wielostołowe (tylko dwa pokazane w przykładzie), w którym muszę zachować wszystkie wiersze z tabeli podstawowej. Oczywiście używam LEFT JOIN, aby uwzględnić wszystkie wiersze w tabeli podstawowej. Bez klauzuli WHERE działa świetnie - gdy wiersz nie istnieje w tabeli Right, wiersz z tabeli Left nadal jest wyświetlany, tylko z 0 z kolumny w tabeli Right. Pierwsze dwa wiersze w zestawie danych to Etykiety z lewej tabeli i Liczba wierszy z prawej tabeli pogrupowane według etykiety. Wszystko, czego chcę, to liczba 0, gdy etykieta nie ma przypisanej wartości z tabeli 2.
Tabela 1
Label | FK
----------
Blue | 1
Red | 2
Green | 3
Tabela 2
Values | Color | Date
---------------------------
Dog | 1 | 02/02/2010
Cat | 2 | 02/02/2010
Dog | 1 | 02/02/2010
Cat | 2 | 02/02/2010
Pytanie:
SELECT 1.Label, COUNT(2.values)
FROM Table1 1
LEFT JOIN Table2 2 ON 1.fk = 1.pk
GROUP BY 1.Label
Dobry zestaw wyników - brak filtrów
Blue | 2
Red | 2
Green | 0
Świetny!
Moim problemem jest to, że gdy dodam kryteria filtrowania, aby usunąć wiersze z tabeli Right, wiersz zostanie usunięty dla moich lewych wierszy łączenia (zerowanie ich), a lewe wiersze zostaną usunięte. Muszę pozostawić lewe wiersze, nawet jeśli ich liczba jest filtrowana do zera.
SELECT 1.Label, COUNT(2.values)
FROM Table1 1
LEFT JOIN Table2 2 ON 1.fk = 1.pk
WHERE 2.Date BETWEEN '1/1/2010' AND '12/31/2010'
GROUP BY 1.Label
Zestaw wyników bummer - po filtrach
Blue | 2
Red | 2
Książęta!
Więc co do diabła? Czy muszę uzyskać tabelę tymczasową z przefiltrowanym zestawem danych, a następnie dołączyć ją do tabeli Left? czego mi brakuje? Dzięki!
Wykonaj drugie połączenie lub rekurencyjne połączenie. Zdobądź mój „dobry” stolik łączący, zdobądź drugi „przefiltrowany” stół, a następnie LEWO DOŁĄCZ do nich