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