为什么SQL查询返回重复?

问题描述:

我有以下查询。奇怪的是,它为同一个人返回多个记录 - 但它应该为每个人返回一行。这是基于CONTACT1 C的所有左连接 - 每个人只有一行,而不像其他列有时对同一个人有多行。为什么SQL查询返回重复?

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

请看看你是否可以得到正确的格式... – riwalk 2010-07-02 19:52:02

+0

刚刚更新...已格式化,然后堆叠重置它。 – davemackey 2010-07-02 19:53:47

+1

我认为这些重复内容来源于不同层次的学校教育与联系记录有关。任何想上大学的人都会有高中/ GED,例如...... – 2010-07-02 20:10:44

左连接将产生1对多关系中的重复项。无论第一个表中有多少条记录,如果您将第一个表中的每条记录的连接保留为多行,您将获得多行记录。如果所有列的行实际上都是重复的,选择区别会删除重复项,但不会消除在任何列中具有不同值的“重复项”。

+0

谢谢。这很有帮助......但选择独特并不能解决问题。有没有办法让我不要做这种重复?我拉着确切的信息。从其他行我想... – davemackey 2010-07-02 20:01:47

+3

@davemackey - 如果选择独特不删除您的重复,那么他们在技术上不重复。如果你仔细看看你的结果集,那么在一列或另一列中肯定会有不同的行。如果您从任何辅助表中选择标识列就足够了。否则,它表示在一些辅助表的列中有不同的数据值。 – 2010-07-02 20:06:07

如果您在服务器上拥有SHOW PLAN权限,可以快速确定重复项的来源 - 添加一个WHERE子句(例如,WHERE C.ACCOUNTNO ='某个值'),您希望返回单个行(但是您已经确定该值实际上会返回> 1行),启用“包括实际执行计划”,运行查询并将鼠标悬停在计划的各个阶段之间的链接上 - 在某些时候,您会发现> 1条记录是从特定阶段发出的,并且查看此阶段的详细信息可以揭示重复的原因。