2017-09-26 63 views
0

我敢肯定有人會馬上發現我對此感到困惑,所以在此先感謝。我有一個使用group-by名稱和zipcode字段的子查詢,篩選組數> 1.我得到528個組。我想查看單個完整記錄,因此我在名稱和郵政編碼字段上對此結果集執行內部聯接。由於每個子查詢行至少代表兩條記錄,因此我期望至少會看到2條X 528記錄的最小值。但是我只能得到190行,並且無法找出我邏輯中的缺陷。SQLGroup-通過子查詢

select m1.* 
from MasterList m1 
join 
(
    select FirstName, LastName, Zipcode, count(*) Cnt 
     from MasterList m2 
     group by FirstName, LastName,Zipcode 
     having count(*) > 1 
) x 
on m1.FirstName = x.FirstName and 
m1.LastName = x.LastName and 
m1.Zipcode = x.Zipcode 

我希望這是足夠的細節。我不能理解這個連接是如何工作的。但是如果我使用過濾條件而不是連接條件,我會得到相同的結果。再次

感謝, JimK

+0

'每個子查詢行代表至少兩個記錄'是錯誤的。對於'm1'中的每一行,您在'x'中有0或1行 –

+1

提供樣本數據,預期結果和對它們的解釋,可能有人幫助您解決任務 –

+0

我的意思是說,對於x中的每一行, m1中至少應該有兩行。 – user3091705

回答

0

你有任何NULL名字,姓氏或郵編?有時可能會弄亂結果。如果沒有看到任何樣本數據,我真的不能幫太多,但試試你的JOIN子句中執行以下操作:

on isnull(m1.FirstNamem, '') = isnull(x.FirstName, '') and 
isnull(m1.LastName, '') = isnull(x.LastName, '') and 
isnull(m1.Zipcode, '') = isnull(x.Zipcode, '') 
+0

https://technet.microsoft.com/zh-cn/library/ms190409(v=sql.105).aspx – NonProgrammer

+0

是的,就是這樣。謝謝。 – user3091705

0

你可能在一個領域NULL值。在任何情況下,窗口函數都是更好的方法:

select m.* 
from (select m.*, count(*) over (partition by FirstName, LastName, Zipcode) as cnt 
     from MasterList m 
    ) m 
where cnt > 1; 
+0

是的,這當然是更優雅的解決方案。它如何更實用地成爲「更好」的方法? – user3091705

+0

@ user3091705。 。 。不鼓勵使用函數,因爲它會嚴重抑制優化。這應該執行得更快,因爲SQL引擎針對窗口函數進行了優化(窗口函數替代了'join'和'group by')。另外,它自動爲'NULL'值工作。 –