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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top