PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres Left Join with where condition

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