0

我正在尝试在我的数据库中查找潜在的重复项。有些人可能有重复,因为他们在姓名或姓氏中添加了“-”(无论出于何种原因)。我的查询目前不会拉出可能与“-”重复的人。最好的方法是什么?

这是我到目前为止的查询

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
4

2 回答 2

0

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

我在 Google 上快速搜索了 Levenshtein distance 和 Edit distance SQL Server,发现以下堆栈溢出线程以及其他可能有用的结果: Levenshtein distance in T-SQL

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

于 2013-06-24T18:29:11.420 回答
0

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

于 2013-06-24T18:23:17.920 回答