sql >> Databáze >  >> RDS >> PostgreSQL

Postgres vlevo Připojte se s podmínkou, kde

vlevo spojí dvě tabulky s podmínkou kde

Obvykle je špatně použít LEFT [OUTER] JOIN a poté filtrovat pomocí WHERE podmínku, čímž zrušíte speciální funkci LEFT JOIN zahrnout všechny řádky z levé tabulky bezpodmínečně . Podrobné vysvětlení:

  • Podrobněji vysvětlete návrh výkonu JOIN vs. LEFT JOIN a WHERE condition

Do WHERE vložte podmínky, které mají filtrovat všechny řádky klauzule (rid = 2 ), ale vytvořte podmínky pro řádky s levým spojením z record_table jsou skutečné podmínky připojení:

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;

Jak bylo uvedeno, má smysl zahrnout sloupce z time_table ve výsledku, ale to je můj volitelný doplněk.

Musíte si také ujasnit dolní a horní hranice . Obecnou konvencí je zahrnout nižší a vyloučit horní mez v čase (timestamp ) se pohybuje. Proto používám >= a < výše.

Související:

  • Dotaz SQL na časovou řadu pro výpočet průměru
  • Výběr průměru záznamů seskupených podle 5minutových období

Výkon by neměl být vůbec žádný problém se správnými indexy. Potřebujete index (nebo PK) na time_table(rid) a další na record_table(date) .



  1. Nejčastější dotazy k nalezení opravy použité v aplikacích Oracle

  2. Odstranit duplikáty pouze pomocí dotazu MySQL?

  3. java - předávání pole v uložené proceduře Oracle

  4. Použití Substr s Instr k extrahování řetězce v Oracle