在SQL Server 2008中查找具有连字符或破折号的潜在重复项

时间:2013-06-24 18:16:18

标签: sql sql-server-2008 duplicates

我正在尝试在我的数据库中找到潜在的重复项。 有些人可能会有副本,因为他们在他们的名字或姓氏中添加了“ - ”(因为有原因)。 我的查询目前不会吸引那些可能与“ - ”有重复的人。 什么是最好的方法呢?

这是我目前的查询

SELECT t1.FirstName, t1.LastName, t1.ID, t2.dupeCount
FROM Contact t1
INNER JOIN (
    SELECT FirstName, REPLACE(LastName, '-', ' ') as LastName, COUNT(*) AS dupeCount
    FROM Contact
    GROUP BY FirstName, LastName
    HAVING COUNT(*) > 1
) t2 ON ((SOUNDEX(t1.LastName) = SOUNDEX(t2.LastName) 
OR SOUNDEX(REPLACE(t1.LastName, '-', ' ')) like '%' + SOUNDEX(t2.LastName) + '%'  
OR SOUNDEX(REPLACE(t2.LastName, '-', ' ')) like '%' + SOUNDEX(t1.LastName) + '%' )
AND SOUNDEX(t1.FirstName) = SOUNDEX(t2.FirstName))
ORDER BY t1.LastName, t1.ID

2 个答案:

答案 0 :(得分:0)

这比您在一个Select语句中修复的内容要多得多。当我遇到这个时,我创建一个存储过程并修剪前导和尾随空格,删除不应该存在的标点符号(例如在某些时间缩写的中间名称而不是其他时间),并检查以查看如果电话号码,地址/邮政编码组合和/或电子邮件地址指向同一个人。 Soundex有所帮助,但这还不够。

答案 1 :(得分:0)

像Levenshtein距离算法这样的东西会很有用,它会测量你需要对字符串进行编辑的次数,使其与另一个字符串相同。在Oracle中,在utl_match库下有一个名为edit_distance的内置函数,但我不知道SQL Server中的内置版本。

我快速搜索了Levenshtein距离和编辑距离SQL Server,并在其他可能有用的结果中找到了以下堆栈溢出线程: Levenshtein distance in T-SQL

如果您能够创建一个可以调用以获得Levenshtein距离的函数,那么您只需过滤查询距离是否为< x,根据需要设置阈值。