Für INNER JOIN
, sind sie logisch äquivalent und die gleichen Ergebnisse erzielen. Ich würde erwarten, dass der Abfrageplaner identische Pläne für beide Abfragen generiert, aber es besteht die Möglichkeit, dass er mit einer komplex genug Abfrage wackelig tun könnte. Ich persönlich bin dieser Situation nicht begegnet, aber ich kann nicht ausschließen, dass der Optimierer seltsame Dinge tut.
So, für INNER JOIN
s ist der Unterschied größtenteils Lesbarkeit. Wenn Sie jedoch vermuten, dass der Abfrageplaner einen seltsamen Plan generiert, versuchen Sie, die Abfrage zu ändern und die Abfragepläne zu vergleichen.
Für OUTER JOIN
s, das ist eine andere Geschichte. Betrachten Sie die folgenden Abfragen statt:
SELECT * FROM MyTable1 mto
LEFT JOIN MyTable2 mto2 on mto1.key = mto2.key
WHERE mto2.somefield = somevalue
VS
SELECT * FROM MyTable1 mto
LEFT JOIN MyTable2 mto2 on mto1.key = mto2.key
AND mto2.somefield = somevalue
In diesem Fall Ihre WHERE
Klausel wirkt über die rechte Tabelle einer LEFT OUTER JOIN
. Die erste Abfrage zieht alle Ergebnisse aus den LEFT OUTER JOIN
und dann Filter diejenigen über die WHERE
Klausel. Dies verwandelt die OUTER JOIN
in eine INNER JOIN
.
Auf der anderen Seite, die zweite Abfrage wird sowohl die Bedingungen als Teil der LEFT OUTER JOIN
und Rück NULL
für Aufzeichnungen behandeln, die beiden Bedingungen der ON
Klausel nicht damit seine OUTER JOIN
Natur Halt erfüllen.
Dies gilt auch für alle WHERE
Bedingung über eine Spalte auf der linken Tabelle einer RIGHT OUTER JOIN
.
Wenn die WHERE
-Bedingung über einer Spalte in der linken Tabelle auf einer LEFT OUTER JOIN
oder in der rechten Tabelle auf einer RIGHT OUTER JOIN
war, wären die Ergebnisse nicht beeinträchtigt worden.
Sie könnten 'EXPLAIN PLAN' ausführen und sehen, ob es einen Unterschied gibt. –