Pregunta

Para mi sorpresa, las siguientes dos consultas están dando resultados diferentes:

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;

Estoy imaginando que no debería importar cuando LEFT JOIN en zig , ya que no estoy usando zig columnas al unirse a la barra y baz . Sin embargo, parece que en este último, JOIN -ing de bar y baz se traga las filas donde zig tenía valores de null ... ¿por qué?

¿Fue útil?

Solución

Esto funciona bien. Estaba equivocado.

Otros consejos

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

Entonces, en la primera declaración, estás filtrando filas de foo en tu primera unión (aquellas que no tienen bar_id = bar.id)

pero en la segunda declaración se incluyen todos foo con su combinación izquierda.

Esto fue más difícil de articular de lo que anticipé cuando comencé a escribir esto; avísame si tiene sentido para ti.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top