a sinistra unisci due tabelle con una condizione where
Di solito è sbagliato per usare un LEFT [OUTER] JOIN e poi filtra con un WHERE condizione, annullando così la caratteristica speciale di un LEFT JOIN per includere tutte le righe della tabella di sinistra incondizionatamente . Spiegazione dettagliata:
- Spiega più dettagliatamente JOIN vs. LEFT JOIN e WHERE condition performance suggerimento
Inserisci le condizioni che dovrebbero filtrare tutte le righe nel WHERE clausola (rid = 2 ), ma stabilisci le condizioni per unire a sinistra le righe da record_table essere condizioni di partecipazione effettive:
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;
Come commentato, ha senso includere colonne da time_table nel risultato, ma questa è la mia aggiunta facoltativa.
Devi anche essere chiaro sui limiti inferiore e superiore . La convenzione generale è di includere inferiore ed escludi il limite superiore dell'ora (timestamp ) intervalli. Da qui il mio uso di >= e < sopra.
Correlati:
- Query SQL su una serie temporale per calcolare la media
- Selezione di una media di record raggruppati per periodi di 5 minuti
Le prestazioni dovrebbero essere nessun problema con gli indici giusti. Hai bisogno di un indice (o PK) su time_table(rid) e un altro su record_table(date) .