Was ist der Vorrang mehrere JOIN-Anweisungen in sqlite?
-
03-07-2019 - |
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?
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.