Frage

Die folgenden zwei Abfragen unterschiedliche Ergebnisse zurückgeben, zu meiner Überraschung:

SELECT *
  FROM foo
       JOIN bar
         ON bar.id=foo.bar_id

       JOIN baz
         ON baz.id=foo.baz_id

       LEFT JOIN zig
         ON zig.foo_id=foo.id;

und

SELECT *
  FROM foo
       LEFT JOIN zig
         ON zig.foo_id=foo.id

       JOIN bar
         ON bar.id=foo.bar_id

       JOIN baz
         ON baz.id=foo.baz_id;

Ich stelle mir vor, dass es sollte keine Rolle spielen, wenn Sie auf LEFT JOIN zig, da ich nicht bin zig Spalten zu verwenden, wenn die bar und baz Beitritt. Es scheint jedoch, dass bei letzteren die JOIN-ing von bar und baz die Zeilen verschlingt wo zig null Werte hatte ... warum ist das denn?

War es hilfreich?

Lösung

Das funktioniert gut. Ich war falsch.

Andere Tipps

Diese unterscheiden sich da, wo der linken Seite kommen in der Anweisung. Denken Sie daran, dass schließt sich nicht nur auf die beiden Tabellen, die Sie Felder vergleichen auf, sondern alles, was Sie haben zu diesem Punkt und dem nächsten Tisch verbunden werden.

So in der ersten Anweisung Sie filtern aus Reihen von foo in Ihrem ersten join (diejenigen, die nicht über bar_id = bar.id)

, aber in der zweiten Anweisung Sie sind einschließlich aller foo mit beitreten linken Seite.

Das war schwieriger zu artikulieren, als ich gedacht, als ich anfing zu schreiben, lassen Sie mich wissen, ob es Sinn macht für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top