Maison >base de données >tutoriel mysql >Pourquoi ma jointure extérieure gauche SQL renvoie-t-elle plus de lignes que la table gauche?
Comprendre SQL LEFT OUTER JOIN : pourquoi plus de lignes que la table de gauche ?
Une idée fausse courante à propos de LEFT OUTER JOIN
est qu'il renvoie toujours le nombre exact de lignes du tableau de gauche. Bien qu'il inclut toutes les lignes du tableau de gauche, il peut en fait produire plus de lignes s'il y a des correspondances en double dans le tableau de droite.
Illustrons cela avec un exemple :
Considérez cette requête :
<code class="language-sql">SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID FROM SUSP.Susp_Visits LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum</code>
Cette requête vise à joindre Susp_Visits
(table de gauche) à Dim_Member
(table de droite). Intuitivement, on pourrait s'attendre à un maximum de 4935 lignes (en supposant que cela représente Susp_Visits
). Cependant, le résultat réel pourrait être plus important.
La raison est qu'un LEFT OUTER JOIN
crée une ligne dans l'ensemble de résultats pour chaque correspondance entre les tables de gauche et de droite. Si une seule ligne dans Susp_Visits
correspond à plusieurs lignes dans Dim_Member
, elle sera dupliquée dans la sortie, ce qui entraînera plus de lignes que prévu initialement.
Par conséquent, un nombre de lignes plus grand que prévu après un LEFT OUTER JOIN
indique qu'au moins une ligne dans le tableau de gauche a plusieurs lignes correspondantes dans le tableau de droite en fonction de la condition de jointure.
Pour résoudre ce problème :
SELECT
sur la table de gauche sans aucune jointure.DISTINCT
à votre instruction SELECT
: SELECT DISTINCT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID ...
Cela supprimera les lignes en double de l'ensemble de résultats.Cela clarifie le comportement de LEFT OUTER JOIN
et fournit des solutions pour gérer les situations où l'ensemble de résultats dépasse le nombre de lignes dans le tableau de gauche.
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!