links voeg twee tabellen samen met een waar-voorwaarde
Het is meestal fout om een LEFT [OUTER] JOIN
. te gebruiken en filter dan met een WHERE
voorwaarde, waardoor de speciale functie van een LEFT JOIN
. vervalt om alle rijen uit de linkertabel onvoorwaardelijk op te nemen . Gedetailleerde uitleg:
- Leg JOIN vs. LEFT JOIN en WHERE prestatiesuggestie voor de conditie in meer detail uit
Zet voorwaarden die geacht worden alle rijen te filteren in de WHERE
clausule (rid = 2
), maar maak voorwaarden om links samen te voegen met rijen uit record_table
daadwerkelijke deelnamevoorwaarden zijn:
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;
Zoals opgemerkt, is het logisch om kolommen op te nemen uit time_table
in het resultaat, maar dat is mijn optionele toevoeging.
Je moet ook duidelijk zijn over onder- en bovengrenzen . De algemene conventie is om op te nemen de onderste en uitsluiten de bovengrens in de tijd (timestamp
) bereiken. Vandaar mijn gebruik van >=
en <
hierboven.
Gerelateerd:
- SQL-query op een tijdreeks om het gemiddelde te berekenen
- Een gemiddelde van records selecteren, gegroepeerd op perioden van 5 minuten
Prestaties zouden helemaal geen probleem moeten zijn met de juiste indexen.Je hebt een index (of PK) nodig op time_table(rid)
en nog een op record_table(date)
.