Inner join dans SQL renvoie des lignes en double
J'ai 3 tables:
Person TeamMember Provider
PersonId PersonName PersonId ProviderId IsLead ProviderId ProviderName
--------- ---------- -------- ------------ -------- ------------ --------
P1 ABC P1 PR1 Yes PR1 Provider1
P2 PQR P1 PR2 No PR2 Provider2
P1 PR3 No PR3 Provider3
-------------------------------
P2 PR1 No
P2 PR2 No
P2 PR3 No
Et j'ai besoin de la sortie (correspondant à PersonId et IsLead = 'Oui'):
PersonId PersonName ProviderName
--------- ---------- ------------
P1 ABC Provider1
P2 PQR NULL
Je suis aide-dessous inner join sur le dessus de 3 tables mais je m obtenir des doublons de lignes dans le résultat.
SELECT P.PersonID, P.PersonName,
CASE WHEN TM.IsLead = 'Yes' THEN Pr.ProviderName
WHEN TM.IsLead = 'No' THEN NULL END AS ProviderName
FROM Person P INNER JOIN TeamMember TM ON P.PersonID = TM.PersonID
INNER JOIN Provider PR ON Pr.ProviderId = TM.ProviderId
J'ai essayé d'utiliser distinctes, mais même cela n'a pas aide.
Toute aide serait grandement appréciée!
Vous êtes en train de faire un "arbre" de jointure. une racine de la table de rejoindre à deux distinctes à l'aide de différentes conditions. Vous obtenez le comportement attendu. Si joint Une table a 4 enregistrements correspondants, et rejoint la table B a 8, vous allez obtenir 8 rangées de dossiers, où 4 d'entre eux ont des valeurs null pour les enregistrements. par exemple, vous obtiendrez toujours autant d'enregistrements que nécessaire pour gérer tous les enregistrements correspondants de la max(appariées) tableau.
OriginalL'auteur Maltesh | 2014-05-26
Vous devez vous connecter pour publier un commentaire.
Pour votre solution fonctionne correctement, vous aurez besoin d'utiliser un
LEFT JOIN
et déplacer le CAS de l'expression de la clause de JOINTURE. Je crois que la requête suivante adaptée à vos besoins.Vous pouvez consulter un exemple sur SQLFIDDLE.
OriginalL'auteur NickyvV