¿Cuál es la prioridad de las múltiples declaraciones de JOIN en sqlite?
-
03-07-2019 - |
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é?
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.