Heim >Datenbank >MySQL-Tutorial >Warum schlägt mein Left Outer Join fehl, wenn ich Datumsparameter zur WHERE-Klausel hinzufüge?
Fehlerbehebung bei einem LEFT OUTER JOIN mit Datumsfiltern
Diese SQL-Abfrage verwendet einen LEFT OUTER JOIN über drei Tabellen hinweg: salesrep
, prescriber
und prescriptions
. Ziel ist es, alle Daten aus salesrep
abzurufen, auch wenn in prescriber
oder prescriptions
keine passenden Einträge vorhanden sind. Das Problem entsteht, wenn der WHERE
-Klausel Datumsparameter hinzugefügt werden. Anstatt wie erwartet alle salesrep
-Daten zurückzugeben, gibt die Abfrage nur Ergebnisse zurück, bei denen in allen drei Tabellen Übereinstimmungen vorhanden sind.
Das Problem ergibt sich aus der Filterung nach prescriptions.filldate
innerhalb der WHERE
-Klausel. Diese Bedingung wandelt den LEFT OUTER JOIN effektiv in einen INNER JOIN für diejenigen salesrep
-Einträge um, denen entsprechende prescriptions
-Daten fehlen, da die WHERE
-Klausel Zeilen mit NULL
-Werten für prescriptions.filldate
eliminiert.
Die Lösung: Datumsfilter in die JOIN-Bedingung verschieben
Der richtige Ansatz besteht darin, die Datumsbeschränkungen aus der WHERE
-Klausel in die ON
-Klausel des LEFT OUTER JOIN zwischen prescriber
und prescriptions
zu verschieben. Dadurch wird sichergestellt, dass sich die Datumsfilterung nur auf die Verknüpfung zwischen diesen beiden Tabellen auswirkt und gleichzeitig das beabsichtigte Verhalten des LEFT OUTER JOIN in Bezug auf salesrep
.
Der korrigierte Join sollte so aussehen:
<code class="language-sql">LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no AND prescriptions.filldate >= '09-01-12' AND prescriptions.filldate <= '09-17-12'</code>
Durch die Platzierung der Datumseinschränkungen in der ON
-Klausel werden Zeilen aus salesrep
in die Ergebnisse einbezogen, auch wenn es in prescriptions
keine passenden Einträge gibt, die die Datumskriterien erfüllen. Diese Zeilen enthalten einfach NULL
-Werte für die Spalten von prescriber
und prescriptions
. Dies spiegelt genau das gewünschte Verhalten eines LEFT OUTER JOIN wider.
Das obige ist der detaillierte Inhalt vonWarum schlägt mein Left Outer Join fehl, wenn ich Datumsparameter zur WHERE-Klausel hinzufüge?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!