2009-12-09 24 views
3

我有一個遺留數據庫: 名,姓,地址1,地址2,地址3,地址4,郵政編碼 數據分散在不同的列之間沒有一致性,例如實際的郵政編碼可能在任何欄目中,並且有很多錯別字。T-SQL Soundex /區別查找重複行

有沒有一種方法可以在SP中使用SOUNDEX/DIFFERENCE之類的東西來遍歷所有內容並返回可能重複的有序列表? [它不需要要快]

回答

3

如果您使用的是SQl server 2005或更高版本,則可以使用SSIS中的模糊匹配來執行此任務。我發現這樣做的效果明顯好於尋找soundex匹配或編寫我自己的sql scode來尋找近乎匹配的結果。

+0

模糊匹配是太棒了。請注意,它們需要SQL Server企業版。這裏有一篇文章展示瞭如何使用它們:http://www.sqlteam.com/article/using-fuzzy-lookup-transformations-in-sql-server-integration-services – 2009-12-18 16:15:05

1

如果你只是想獲得可能重複,在checksum/binary_checksum功能會給你一個很好的跡象,但它只是一個32位的散列所以根據您的數據集大小你最終可能會有一些誤報。 checksum()不區分大小寫,binary_checksum()區分大小寫。這會給你的每一條記錄一個32位的散列表格:

select checksum(*), binary_checksum(*) 
from  tableName; 

你可以做自連接上的重複哈希匹配用不同的ID值(或不同的名稱值等,這取決於是什麼讓一個記錄給定數據集中唯一的記錄)。會是這個樣子:

select id, checksum(*) 
from  tableName a 
join  tableName b 
on  a.checksum(*) = b.checksum(*) 
and  a.id <> b.id; 

這兩個功能可以採取任何列的列表參數,並提供一個哈希值,所以如果你只是想散列FNAME,LNAME,地址等欄目,而不是整個記錄,你的校驗和函數看起來像這樣:

checksum(a.fName, a.lName, a.address, ...) 

而不是像上面例子中的校驗和(*)。

+0

不錯,對於精確搜索來說並不是那麼有用,可以找到幾乎錯過的東西。 – HLGEM 2009-12-09 17:35:22

+0

ahhh - 我想我誤解了OP的意圖......我原本以爲他正在尋找可以清除的副本(即在不同位置/列中具有相同的整體值的副本)。在重新閱讀並看到上面的答案後,聽起來像OP正在尋找模糊匹配,這與我的答案完全不同... – chadhoc 2009-12-09 18:38:38