Pergunta

As duas consultas a seguir estão retornando resultados diferentes, para minha surpresa:

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;

Eu estou imaginando que não deveria importar quando você LEFT JOIN em zig, desde que eu não estou usando colunas de zig quando aderiu ao bar e baz. No entanto, parece que, neste último, de JOIN e bar engole as linhas onde baz tinham valores zig o ing null-... por que isso?

Foi útil?

Solução

Isso funciona bem. Eu estava errado.

Outras dicas

Estes são diferentes por causa de onde a sua esquerda participar é no comunicado. Lembre-se que se junta não são apenas sobre as duas tabelas que você está comparando campos, mas sim tudo o que você juntou-se a esse ponto ea tabela seguinte.

Assim, na primeira declaração que você está filtrando as linhas de foo em seu primeiro unir-se (aqueles que não têm bar_id = bar.id)

mas no segundo declaração que você está incluindo todos os foo com a sua associação à esquerda.

Este foi mais difícil de articular do que eu esperava quando comecei a escrever isto, deixe-me saber se faz sentido para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top