Jointures SQL imbriquées : INNER JOIN et OUTER JOIN
Est-ce qu'un INNER JOIN
suivant un OUTER JOIN
annule l'effet du OUTER JOIN
? Et les INNER JOIN
s devraient-ils toujours précéder les OUTER JOIN
s dans les requêtes à jointures multiples ?
La réponse est nuancée. Un INNER JOIN
ultérieur n'annulera le OUTER JOIN
que si sa clause ON
nécessite la présence de colonnes qui pourraient être NULL
dues au OUTER JOIN
. Réorganiser simplement les jointures ne résoudra pas ce problème ; vous devrez remplacer le INNER JOIN
par un OUTER JOIN
approprié.
Illustrons :
Exemple 1 (la réorganisation n'a pas d'importance) :
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN email ON person.email_id = email.id</code>
Ici, réorganiser les jointures ne modifiera pas les résultats.
Exemple 2 (questions de réorganisation) :
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN city ON address.city_id = city.id</code>
La deuxième clause ON
nécessite un non-NULL
address.city_id
. Cela va à l'encontre du LEFT OUTER JOIN
, en filtrant les person
enregistrements sans correspondance city
via address
. Pour corriger cela, remplacez le INNER JOIN
par un LEFT OUTER JOIN
.
Bonnes pratiques :
Bien que cela ne soit pas strictement obligatoire, il est généralement recommandé de placer les INNER JOIN
avant les OUTER JOIN
. Cela améliore la lisibilité et clarifie les conditions essentielles de filtrage de la requête. De plus, les RIGHT OUTER JOIN
sont souvent moins préférés et peuvent généralement être réécrits en utilisant des LEFT OUTER JOIN
pour une meilleure clarté et une meilleure maintenabilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!