Quelle est la priorité de plusieurs instructions JOIN dans sqlite?
-
03-07-2019 - |
Question
Les deux requêtes suivantes renvoient des résultats différents, à ma grande surprise:
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;
et:
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;
J'imagine que cela ne devrait pas avoir d'importance lorsque vous LEFT JOIN
sur zig
, car je n'utilise pas les codes zig
. colonnes lors de la jonction des barres
et baz
. Cependant, il apparaît que dans ce dernier, JOIN
-ing de bar
et baz
engloutit les lignes où zig
avait null
valeurs ... pourquoi est-ce?
La solution
Cela fonctionne bien. Je me suis trompé.
Autres conseils
Celles-ci sont différentes en raison de l'emplacement de votre jointure gauche dans la déclaration. N'oubliez pas que les jointures ne concernent pas uniquement les deux tables sur lesquelles vous comparez des champs, mais plutôt tout ce que vous avez joint jusqu'à ce point et la table suivante.
Ainsi, dans la première instruction, vous filtrez les lignes de foo lors de votre première jointure (celles qui n'ont pas bar_id = bar.id)
mais dans la deuxième déclaration, vous incluez tout foo avec votre jointure gauche.
C’était plus difficile à articuler que je ne le pensais quand j’ai commencé à écrire ceci, faites-moi savoir si cela vous dit quelque chose.