Heim >Datenbank >MySQL-Tutorial >Warum fehlen Zeilen in meinem Left-Join-Ergebnis?
Diskrepanz beim linken Join: Zeilen weggelassen
In dieser Abfrage funktioniert der LEFT JOIN zwischen den Tabellen #appSteps und #appProgress nicht richtig, was dazu führt, dass Ausschluss erwarteter Zeilen aus der Ergebnismenge.
Abfrage in Frage:
select p.appId, s.stepId, s.section, p.start from #appSteps s with (nolock) left join #appProgress p on s.stepId = p.stepId where s.section is not null and p.appId = 101
Erwartetes Ergebnis:
appId | stepId | section | start |
---|---|---|---|
101 | 1 | Section 1 | 2016-01-03 00:00:00.000 |
101 | 2 | Section 2 | 2016-01-03 00:00:00.000 |
101 | 10 | Section 3 | NULL |
Tatsächliches Ergebnis:
appId | stepId | section | start |
---|---|---|---|
101 | 1 | Section 1 | 2016-01-03 00:00:00.000 |
101 | 2 | Section 2 | 2016-01-03 00:00:00.000 |
Lösung:
Das fehlerhafte Verhalten tritt auf davon ab, die rechte Tabelle (#appProgress) in die WHERE-Klausel aufzunehmen. Durch Verschieben dieser Bedingung in die ON-Klausel des LEFT JOIN kann das gewünschte Ergebnis erzielt werden:
Select P.appId, S.stepId, S.section, P.start From #appSteps S With (NoLock) Left Join #appProgress P On S.stepId = P.stepId And P.appId = 101 Where S.section Is Not Null
Bei einem LEFT JOIN wird die WHERE-Klausel nach dem Join ausgeführt, was bedeutet, dass Zeilen von rechts- Handtabellen, die die Kriterien der WHERE-Klausel nicht erfüllen, werden aus der Ergebnismenge ausgeschlossen. Durch das Einschließen der rechten Tabelle in die WHERE-Klausel wird diese effektiv in einen INNER JOIN umgewandelt und die erwarteten Ergebnisse herausgefiltert.
Das obige ist der detaillierte Inhalt vonWarum fehlen Zeilen in meinem Left-Join-Ergebnis?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!