我正在尝试在我的数据库中找到潜在的重复项。 有些人可能会有副本,因为他们在他们的名字或姓氏中添加了“ - ”(因为有原因)。 我的查询目前不会吸引那些可能与“ - ”有重复的人。 什么是最好的方法呢?
这是我目前的查询
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
答案 0 :(得分:0)
这比您在一个Select语句中修复的内容要多得多。当我遇到这个时,我创建一个存储过程并修剪前导和尾随空格,删除不应该存在的标点符号(例如在某些时间缩写的中间名称而不是其他时间),并检查以查看如果电话号码,地址/邮政编码组合和/或电子邮件地址指向同一个人。 Soundex有所帮助,但这还不够。
答案 1 :(得分:0)
像Levenshtein距离算法这样的东西会很有用,它会测量你需要对字符串进行编辑的次数,使其与另一个字符串相同。在Oracle中,在utl_match库下有一个名为edit_distance的内置函数,但我不知道SQL Server中的内置版本。
我快速搜索了Levenshtein距离和编辑距离SQL Server,并在其他可能有用的结果中找到了以下堆栈溢出线程: Levenshtein distance in T-SQL
如果您能够创建一个可以调用以获得Levenshtein距离的函数,那么您只需过滤查询距离是否为< x,根据需要设置阈值。