2009-05-04 7 views
5

Le seguenti due query stanno tornando risultati diversi, con mia grande sorpresa:Qual è la precedenza di più istruzioni JOIN 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; 

e:

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; 

sto immaginando che non dovrebbe importa quando LEFT JOIN su zig, dal momento che' m non utilizzando le colonne zig quando si uniscono allo bar e baz. Tuttavia, sembra che in quest'ultimo, l' -ing di bar e baz inghiotti le righe dove zig aveva valori null ... perché?

+0

Sto iniziando a sospettare che questa sia una semplificazione imprecisa del mio problema - quelle due domande dovrebbero essere identiche, stavo facendo qualcos'altro. –

risposta

3

Questo funziona correttamente. Mi sbagliavo.

2

Questi sono diversi a causa di dove il tuo membro di sinistra è nella dichiarazione. Ricorda che i join non sono solo sulle due tabelle su cui stai confrontando i campi, ma piuttosto su tutto ciò che hai unito a quel punto e alla tabella successiva.

Così nella prima istruzione che si sta filtrando le righe da foo nella vostra prima aderire (quelli che non hanno bar_id = bar.id)

ma nella seconda dichiarazione si includono tutti i foo con la sinistra aderire.

Questo è stato più difficile da articolare di quanto mi aspettassi quando ho iniziato a scrivere questo, fammi sapere se ha senso per te.

+1

Ma anche se, nella seconda affermazione, sto includendo tutto di foo con il primo join di sinistra, non dovrebbero essere filtrate le stesse righe (quelle che non hanno bar_id) nell'ultimo join? –