Comprendre l'interaction des jointures intérieures et extérieures dans sql
Les requêtes SQL complexes utilisent fréquemment plusieurs opérations de jointure, combinant différents types de jointures. Une considération clé est la façon dont l'inclusion des valeurs nulles, caractéristique des jointures externes, est affectée lorsqu'une jointure intérieure est ensuite appliquée.
Comment les jointures internes peuvent affecter les résultats de jointure extérieure
une jointure intérieure, par sa nature, ne renvoie que des lignes où la condition de jointure est remplie dans les deux tables . Si une jointure intérieure suit une jointure extérieure et que l'état de la jointure intérieure repose sur des colonnes qui pourraient être nulles (en raison de la jointure extérieure), il filtre effectivement les lignes où ces colonnes sont nulles. Cela nie l'inclusion de valeurs nulles que la jointure extérieure est initialement fournie.
Exemple illustratif
Examinons un scénario:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;
Le gauche join
garantit que toutes les lignes de la table personne
sont incluses, même s'il n'y a pas d'entrée correspondante dans l'adresse
. Cependant, le inner join
avec e-mail
restreint ensuite les résultats à uniquement les lignes où une personne correspondante e-mail_id
existe dans les deux personne
et e-mail
. Rows from personne
qui avait une adresse correspondante
mais un null email_id
sera exclu.
un scénario problématique et sa solution
Considérez cette requête:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;
ici, le join inner
avec ville
suppose que adresse.city_id
n'est jamais nul. Si certaines adresses n'ont pas de city_id
, ces lignes (et les lignes de personne associées) seront omises, modifiant involontairement les résultats de la gauche initiale
join .
gauche join au lieu de
join inner :
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;
Ceci préserve l'inclusivité de la jointure initiale gauche , gérer correctement les cas où
adresse.city_id pourrait être nul. Cela garantit que tous les enregistrements
personne sont inclus, qu'ils aient une adresse ou une ville associée à eux.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3