2010-07-02 3 views
2

J'ai la requête suivante. Ce qui est étrange, c'est qu'il renvoie plusieurs enregistrements pour le même individu - mais il devrait renvoyer une seule ligne pour chaque individu. C'est tout JOINT JOINS basé sur CONTACT1 C - qui a seulement une ligne pour chaque individu, contrairement aux autres colonnes qui ont parfois plusieurs rangées pour le même individu.Pourquoi SQL Query renvoie-t-il des doublons?

select 
C.ACCOUNTNO as 'AdmitGold Account', 
C2.UNAMEFIRST as 'First Name', 
C2.UNAMELAST as 'Last Name', 
C.KEY1 as 'Status', 
C.KEY4 as 'People ID', 
C.KEY3 as 'Type', 
C.KEY5 as 'Counselor', 
C.CITY as 'City', 
C.STATE as 'State', 
C.SOURCE as 'Source', 
C.DEPARTMENT as 'Major', 
C2.UGENDER as 'Gender', 
C2.UETHNICBG as 'Ethnicity', 
C2.UFULLPART as 'Full/Part', 
SLF_CLG_CS.EXT as 'College - GPA', 
OFF_CLG_CS.EXT as 'College - GPA Official', 
HS_OFF_CS.LINKACCT as 'HS GPA - Official', 
OFF_SAT_COMP.LINKACCT as 'SAT - Verbal', 
OFF_SAT_COMP.COUNTRY as 'SAT - Math', 
(Cast(OFF_SAT_COMP.LINKACCT as float) + Cast(OFF_SAT_COMP.COUNTRY as float)) as 'SAT - Composite', 
OFF_SAT_COMP.EXT as 'SAT - Essay', 
OFF_ACT_COMP.LINKACCT as 'ACT - English', 
OFF_ACT_COMP.COUNTRY as 'ACT - Math', 
OFF_ACT_COMP.ZIP as 'ACT - Reading', 
OFF_ACT_COMP.EXT as 'ACT - ScRe', 
(Cast(OFF_ACT_COMP.LINKACCT as float) + Cast(OFF_ACT_COMP.COUNTRY as float)+ Cast(OFF_ACT_COMP.ZIP as float) + Cast(OFF_ACT_COMP.EXT as float)) as 'ACT - Official' 
    from contact1 C 
left join CONTACT2 C2 on C.ACCOUNTNO=C2.ACCOUNTNO 
left join CONTSUPP HS_OFF_CS on C.ACCOUNTNO=HS_OFF_CS.ACCOUNTNO 
    AND HS_OFF_CS.STATE='O' AND HS_OFF_CS.CONTACT='High School' 
left join CONTSUPP SLF_CLG_CS on C.ACCOUNTNO=SLF_CLG_CS.ACCOUNTNO 
    AND SLF_CLG_CS.CONTACT = 'Transfer College' AND SLF_CLG_CS.STATE='S' 
left join CONTSUPP OFF_CLG_CS on C.ACCOUNTNO=OFF_CLG_CS.ACCOUNTNO 
    AND OFF_CLG_CS.CONTACT = 'Transfer College' AND OFF_CLG_CS.STATE='O' 
left join CONTSUPP OFF_SAT_COMP on C.ACCOUNTNO=OFF_SAT_COMP.ACCOUNTNO 
    AND OFF_SAT_COMP.CONTACT='Test/SAT' AND OFF_SAT_COMP.ZIP='O' 
left join CONTSUPP OFF_ACT_COMP on C.ACCOUNTNO=OFF_ACT_COMP.ACCOUNTNO 
    AND OFF_ACT_COMP.CONTACT='Test/ACT' AND OFF_ACT_COMP.STATE='O' 
    where 
C.KEY1!='00PRSP' 
AND C.U_KEY2='2010 FALL' 
+3

S'il vous plaît voir si vous pouvez obtenir la mise en forme correcte ... – riwalk

+0

Juste mis à jour que ... avait tout formaté, puis la pile réinitialiser. – davemackey

+1

Je pense que les doublons proviennent du fait que divers niveaux de scolarité sont liés à un dossier de contact. Toute personne qui veut aller à l'université aurait des études secondaires/GED, par exemple ... –

Répondre

6

Une jointure à gauche produira des doublons dans une relation un-à-plusieurs. Quel que soit le nombre d'enregistrements dans votre première table, si vous quittez une table avec plusieurs lignes pour chaque enregistrement de la première table, vous obtiendrez plus d'une ligne. Select Distinct supprimera les doublons si les lignes sont réellement dupliquées pour toutes les colonnes, mais n'éliminera pas les 'doublons' qui ont une valeur différente dans toute colonne.

+0

Merci. C'était utile ... mais faire une sélection distincte ne résout pas le problème. Y at-il un moyen pour moi de faire en sorte qu'il ne fasse pas ce dédoublement? Je tire l'information exacte. à partir des autres lignes que je veux ... – davemackey

+3

@davemackey - Si Select Distinct ne supprime pas vos doublons, ils ne sont pas techniquement dupliqués. Si vous regardez dans votre jeu de résultats, il y a forcément des lignes qui diffèrent dans une colonne ou une autre. Si vous sélectionnez les colonnes d'identité de l'une de vos tables auxiliaires, cela suffirait. Sinon, cela indique que dans certaines colonnes de vos tables auxiliaires, il existe différentes valeurs de données. –

1

Un moyen rapide d'identifier d'où viennent les doublons si vous avez les droits SHOW PLAN sur le serveur - ajoutez une clause WHERE (par exemple WHERE C.ACCOUNTNO = 'une certaine valeur') que vous attendez de ramener un seul ligne (mais où vous avez identifié que la valeur ramène> 1 ligne), activer "Inclure le plan d'exécution réel", exécuter la requête et survoler les liens entre les étapes du plan - à un moment donné, vous trouverez que > 1 enregistrement émane d'une étape particulière et l'examen des détails de cette étape peut éclairer la cause de la duplication.