vänster sammanfoga två tabeller med ett where-villkor
Det är vanligtvis fel för att använda en LEFT [OUTER] JOIN
och filtrera sedan med en WHERE
skick, vilket gör att specialfunktionen för en LEFT JOIN
ogiltigförklaras för att inkludera alla rader från den vänstra tabellen villkorslöst . Detaljerad förklaring:
- Förklara JOIN vs. LEFT JOIN och WHERE-förslag till prestanda mer detaljerat
Sätt villkor som ska filtrera alla rader i WHERE
klausul (rid = 2
), men gör villkor för att vänsterkoppla rader från record_table
ut att vara faktiska anslutningsvillkor:
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;
Som kommenterat är det vettigt att inkludera kolumner från time_table
i resultatet, men det är mitt valfria tillägg.
Du måste också vara tydlig med undre och övre gränser . Den allmänna konventionen är att inkludera den lägre och uteslut den övre gränsen i tid (timestamp
) intervall. Därav min användning av >=
och <
ovan.
Relaterat:
- SQL-fråga på en tidsserie för att beräkna genomsnittet
- Välja ett genomsnitt av poster grupperade efter 5-minutersperioder
Prestanda borde vara inga problem alls med rätt index. Du behöver ett index (eller PK) på time_table(rid)
och en annan på record_table(date)
.