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)
.