sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres Vänster Gå med där skick

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



  1. Databas hög tillgänglighet för Camunda BPM med MySQL eller MariaDB Galera Cluster

  2. MariaDB JSON_DETAILED() Förklarad

  3. MySQL-fråga, MAX() + GROUP BY

  4. oracle PL/SQL hur man beräknar intervall ip för IPv6 cidr