2009-05-04 9 views
5

Die folgenden beiden Abfragen sind wieder unterschiedliche Ergebnisse, zu meiner Überraschung:Was ist der Vorrang mehrerer JOIN-Anweisungen in sqlite?

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 keine Rolle, sollten, wenn Sie LEFT JOIN auf zig, da ich m nicht verwendet zig 's Spalten beim Beitritt der bar und baz. Es scheint jedoch, dass in dem letzten, die JOIN -ing von bar und baz schluckt die Zeilen, wo zig hatte null Werte ... warum ist das?

+0

Ich fange an zu vermuten, dass dies eine ungenaue Vereinfachung meines Problems war - diese zwei Abfragen sollten wirklich identisch sein, ich tat etwas anderes. –

Antwort

3

Das funktioniert gut. Ich habe mich geirrt.

2

Diese unterscheiden sich dadurch, dass Ihre linke Verknüpfung in der Anweisung enthalten ist. Denken Sie daran, dass Joins nicht nur auf den beiden Tabellen liegen, auf denen Sie Felder vergleichen, sondern auf allem, was Sie bis zu diesem Punkt und der nächsten Tabelle zusammengefügt haben.

So in der ersten Anweisung Sie von foo Ausfiltern sind Zeilen in Ihrem ersten join (diejenigen, die nicht über bar_id = bar.id)

aber in der zweiten Erklärung, die Sie mit dem linken all foo sind inklusive Beitreten.

Das war schwieriger zu artikulieren, als ich erwartet habe, als ich begann, dies zu schreiben, lassen Sie mich wissen, wenn es für Sie Sinn macht.

+1

Aber selbst wenn ich in der zweiten Anweisung alle foo mit dem ersten linken Join einbinge, sollten nicht dieselben Zeilen (die, die keine bar_id haben) in letzterem Join herausgefiltert werden? –