2009-05-04 14 views
5

Las dos consultas están regresando resultados diferentes, para mi sorpresa:¿Cuál es la precedencia de múltiples declaraciones JOIN en 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; 

y:

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; 

me estoy imaginando que debería no importa cuando LEFT JOIN en zig, ya que' m no usa las columnas zig al unir bar y baz. Sin embargo, parece que en este último, el JOIN -ing de bar y baz se traga las filas donde zig tenían valores null ... ¿por qué?

+0

Estoy empezando a sospechar que esto fue una simplificación inexacta de mi problema; esas dos consultas deberían ser idénticas, estaba haciendo otra cosa. –

Respuesta

3

Esto funciona bien. Estaba equivocado.

2

Estos son diferentes debido a donde se encuentra su unión izquierda en la declaración. Recuerde que las uniones no solo están en las dos tablas en las que compara los campos, sino en todo lo que ha unido hasta ese punto y en la siguiente tabla.

Así, en la primera declaración que está filtrando a cabo las filas de foo en su primera unión (aquellos que no tienen bar_id = bar.id)

pero en la segunda instrucción está incluyendo todos foo con su izquierda unirse.

Esto fue más difícil de articular de lo que esperaba cuando comencé a escribir esto, hágamelo saber si tiene sentido para usted.

+1

Pero incluso si, en la segunda declaración, incluyo todos los foo con la primera combinación de la izquierda, ¿no deberían filtrarse las mismas filas (las que no tienen bar_id) en la última unión? –

Cuestiones relacionadas