我有一個遺留數據庫: 名,姓,地址1,地址2,地址3,地址4,郵政編碼 數據分散在不同的列之間沒有一致性,例如實際的郵政編碼可能在任何欄目中,並且有很多錯別字。T-SQL Soundex /區別查找重複行
有沒有一種方法可以在SP中使用SOUNDEX/DIFFERENCE之類的東西來遍歷所有內容並返回可能重複的有序列表? [它不需要要快]
我有一個遺留數據庫: 名,姓,地址1,地址2,地址3,地址4,郵政編碼 數據分散在不同的列之間沒有一致性,例如實際的郵政編碼可能在任何欄目中,並且有很多錯別字。T-SQL Soundex /區別查找重複行
有沒有一種方法可以在SP中使用SOUNDEX/DIFFERENCE之類的東西來遍歷所有內容並返回可能重複的有序列表? [它不需要要快]
如果您使用的是SQl server 2005或更高版本,則可以使用SSIS中的模糊匹配來執行此任務。我發現這樣做的效果明顯好於尋找soundex匹配或編寫我自己的sql scode來尋找近乎匹配的結果。
如果你只是想獲得可能重複,在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, ...)
而不是像上面例子中的校驗和(*)。
模糊匹配是太棒了。請注意,它們需要SQL Server企業版。這裏有一篇文章展示瞭如何使用它們:http://www.sqlteam.com/article/using-fuzzy-lookup-transformations-in-sql-server-integration-services – 2009-12-18 16:15:05