"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Une jointure intérieure remplace-t-elle l'inclusion des valeurs nuls par une jointure extérieure?

Une jointure intérieure remplace-t-elle l'inclusion des valeurs nuls par une jointure extérieure?

Publié le 2025-03-13
Parcourir:751

Does an INNER JOIN Override an OUTER JOIN's Inclusion of NULL Values?

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 .

L'approche correcte consiste à utiliser un autre

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.

Dernier tutoriel Plus>

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