Achten Sie nur auf den Unterschied mit den äußeren Verbindungen. Eine Abfrage, wo ein Filter von b.IsApproved
(auf der rechten Tabelle, Bar) an den ON
Zustand der JOIN
hinzugefügt:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
Ist NICHT das gleiche wie die Filter in der WHERE
Klausel Abdrucken:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1);
da für ‚nicht bestanden‘ Outer-Joins zu Bar
(dh wo es keine b.BarId
für eine f.BarId
ist), diese b.IsApproved
als NULL
für alle diese fa verlassen Bei geblockten Join-Zeilen werden diese Zeilen herausgefiltert.
Ein anderer Weg, dies zu betrachten, ist, dass für die erste Abfrage, LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId)
wird die linken Tabellenzeilen immer wieder zurückkehren, da LEFT OUTER JOIN
die linken Tabellenzeilen garantiert werden auch zurückgegeben werden, wenn die Verbindung fehlschlägt. Der Effekt des Hinzufügens von (b.IsApproved = 1)
zu der Bedingung LEFT OUTER JOIN
besteht jedoch darin, beliebige rechte Tabellenspalten zu NULLEN, wenn (b.IsApproved = 1)
falsch ist, d. H. Nach den gleichen Regeln, die normalerweise auf eine LEFT JOIN
Bedingung auf (b.BarId = f.BarId)
angewendet werden.
aktualisieren: die Frage von Conrad, die äquivalente LOJ für einen optionalen Filter gefragt abzuschließen wäre:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);
dh die WHERE
Klausel sowohl die Bedingung prüfen muss, ob die Verbindung fehlschlägt (NULL)
und Der Filter wird ignoriert, und der Join ist erfolgreich und der Filter muss angewendet werden.(b.IsApproved
oder b.BarId
könnte für NULL
getestet werden)
ich einen SqlFiddle together here gesetzt haben, die auf die JOIN
die Unterschiede zwischen den verschiedenen Anordnungen des b.IsApproved
Filters relativ zeigt.
Hier ist eine ähnliche Frage: http://stackoverflow.com/questions/2509987/which-sql-query-is-faster-filter-on-join-criteria-or-where-klause –
Die Maschine wird es herausfinden und optimieren Sie es richtig. Für die Menschen, die Debug-Modify-Unterstützung für Ihre Code-Jahre ab sofort benötigen, halten Sie die Filterbedingungen in der WHERE und verbinden Bedingungen in der ON. –
@ KM. Ich weiß nicht immer, wie man den Unterschied zwischen einer Join-Bedingung und einem Filter erkennt. Zum Beispiel [in dieser Antwort] (http://stackoverflow.com/a/9303069/119477) denke ich, es ist besser in der Join so ist das eine "Join-Bedingung" dann? [Hier ist ein weiteres Beispiel] (http://Stackoverflow.com/a/6473403/119477), von dem ich nicht einmal weiß, wie ich die äquivalente Where-Klausel umschreiben soll. –