Qual é a precedência de múltiplas instruções JOIN no SQLite?
-
03-07-2019 - |
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?
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ê.