PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres Left Dołącz do warunku gdzie

lewy połącz dwa stoły z warunkiem WHERE

Zwykle jest niewłaściwe aby użyć LEFT [OUTER] JOIN a następnie filtruj za pomocą WHERE warunek, unieważniając w ten sposób specjalną funkcję LEFT JOIN aby uwzględnić wszystkie wiersze z lewej tabeli bezwarunkowo . Szczegółowe wyjaśnienie:

  • Wyjaśnij bardziej szczegółowo sugestie dotyczące warunków JOIN vs. LEFT JOIN i WHERE

Umieść warunki, które mają filtrować wszystkie wiersze w WHERE klauzula (rid = 2 ), ale stwórz warunki, aby połączyć wiersze z lewej strony z record_table mają być rzeczywistymi warunkami dołączenia:

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 skomentowano, sensowne jest uwzględnienie kolumn z time_table w rezultacie, ale to mój opcjonalny dodatek.

Musisz również jasno określić dolne i górne granice . Ogólna konwencja to zawierać niższy i wyklucz górna granica czasu (timestamp ) zakresy. Stąd moje użycie >= i < powyżej.

Powiązane:

  • Zapytanie SQL o szereg czasowy w celu obliczenia średniej
  • Wybieranie średniej rekordów pogrupowanych co 5 minut

Wydajność nie powinna być żadnym problemem z odpowiednimi indeksami. Potrzebujesz indeksu (lub PK) na time_table(rid) i kolejny w record_table(date) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BŁĄD:odmowa zezwolenia dla sekwencji cities_id_seq przy użyciu Postgres

  2. Ograniczenia dotyczące nazw kolumn tabeli Postgres?

  3. Praca z datami w PostgreSQL

  4. Adnotacja hibernacji dla typu szeregowego PostgreSQL

  5. SQL - Łączenie wielu podobnych zapytań