PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres Left Join with where-Bedingung

Left Join zweier Tabellen mit einer Where-Bedingung

Es ist normalerweise falsch um einen LEFT [OUTER] JOIN zu verwenden und dann mit einem WHERE filtern Bedingung, wodurch die Besonderheit eines LEFT JOIN aufgehoben wird alle Zeilen aus der linken Tabelle bedingungslos einzuschließen . Ausführliche Erklärung:

  • Erklären Sie JOIN vs. LEFT JOIN und Leistungsvorschlag für WHERE-Bedingungen ausführlicher

Setzen Sie Bedingungen, die alle Zeilen filtern sollen, in das WHERE -Klausel (rid = 2 ), aber stellen Sie Bedingungen zur Linksverknüpfung von Zeilen aus record_table als tatsächliche Join-Bedingungen aus:

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;

Wie kommentiert, ist es sinnvoll, Spalten aus time_table einzuschließen im Ergebnis, aber das ist meine optionale Ergänzung.

Sie müssen sich auch über Unter- und Obergrenzen im Klaren sein . Die allgemeine Konvention ist einzuschließen das untere und ausschließen die obere Zeitgrenze (timestamp ) reicht. Daher meine Verwendung von >= und < oben.

Verwandte:

  • SQL-Abfrage einer Zeitreihe zur Berechnung des Durchschnitts
  • Auswählen eines Durchschnitts von Aufzeichnungen, gruppiert nach 5-Minuten-Perioden

Leistung sollte überhaupt kein Problem sein mit den richtigen Indizes. Sie brauchen einen Index (oder PK) auf time_table(rid) und eine andere auf record_table(date) .