2010-07-02 182 views
2

我有以下查詢。奇怪的是,它爲同一個人返回多個記錄 - 但它應該爲每個人返回一行。這是基於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

回答

6

左連接將產生1對多關係中的重複項。無論第一個表中有多少條記錄,如果您將第一個表中的每條記錄的連接保留爲多行,您將獲得多行記錄。如果所有列的行實際上都是重複的,選擇區別會刪除重複項,但不會消除在任何列中具有不同值的「重複項」。

+0

謝謝。這很有幫助......但選擇獨特並不能解決問題。有沒有辦法讓我不要做這種重複?我拉着確切的信息。從其他行我想... – davemackey 2010-07-02 20:01:47

+3

@davemackey - 如果選擇獨特不刪除您的重複,那麼他們在技術上不重複。如果你仔細看看你的結果集,那麼在一列或另一列中肯定會有不同的行。如果您從任何輔助表中選擇標識列就足夠了。否則,它表示在一些輔助表的列中有不同的數據值。 – 2010-07-02 20:06:07

1

如果您在服務器上擁有SHOW PLAN權限,可以快速確定重複項的來源 - 添加一個WHERE子句(例如,WHERE C.ACCOUNTNO ='某個值'),您希望返回單個行(但是您已經確定該值實際上會返回> 1行),啓用「包括實際執行計劃」,運行查詢並將鼠標懸停在計劃的各個階段之間的鏈接上 - 在某些時候,您會發現> 1條記錄是從特定階段發出的,並且查看此階段的詳細信息可以揭示重複的原因。