lewy połącz dwa stoły z warunkiem WHERE
Zwykle jest niewłaściwe aby użyć LEFT [OUTER] JOIN
a następnie filtruj za pomocą WHERE
warunek, unieważniając w ten sposób specjalną funkcję LEFT JOIN
aby uwzględnić wszystkie wiersze z lewej tabeli bezwarunkowo . Szczegółowe wyjaśnienie:
- Wyjaśnij bardziej szczegółowo sugestie dotyczące warunków JOIN vs. LEFT JOIN i WHERE
Umieść warunki, które mają filtrować wszystkie wiersze w WHERE
klauzula (rid = 2
), ale stwórz warunki, aby połączyć wiersze z lewej strony z record_table
mają być rzeczywistymi warunkami dołączenia:
SELECT t.start_date, t.end_date -- adding those
, r.id, r.name, r.date
FROM time_table t
LEFT JOIN record_table r ON r.date >= t.start_date
AND r.date < t.end_date
WHERE t.rid = 2;
Jak skomentowano, sensowne jest uwzględnienie kolumn z time_table
w rezultacie, ale to mój opcjonalny dodatek.
Musisz również jasno określić dolne i górne granice . Ogólna konwencja to zawierać niższy i wyklucz górna granica czasu (timestamp
) zakresy. Stąd moje użycie >=
i <
powyżej.
Powiązane:
- Zapytanie SQL o szereg czasowy w celu obliczenia średniej
- Wybieranie średniej rekordów pogrupowanych co 5 minut
Wydajność nie powinna być żadnym problemem z odpowiednimi indeksami. Potrzebujesz indeksu (lub PK) na time_table(rid)
i kolejny w record_table(date)
.