使用T-SQL查找大约重复的数据库记录?

时间:2009-12-31 02:54:09

标签: sql-server tsql

嘿所有人。我有一个具有相当数行的MSSQL 2008数据库。截至目前,在将新行插入表之前,存储过程将检查数据库中是否已存在该记录(通过选中标记为Title的列)。这个检查是准确的,如果要插入的记录略有不同,它将插入它而不是更新现有的行(这是一个近似匹配)。我想要做的是在插入之前以某种方式检测表中的近似重复。所以要插入一条新记录:

The quick brown fox jumps over the lazy dog

大致匹配:

Quick brown fox jumps over the lazy dog

如果该记录已存在于表中。我已经看到(并用于其他情况)在T-SQL中实现的Levenshtein Distance算法,但我不确定这是否可以应用于我的情况,因为执行算法需要一对输入字符串。社区成员如何处理这类事情?感谢。

3 个答案:

答案 0 :(得分:4)

如果您只需(批量)加载表格,或定期删除重复项,您也可以在SSIS中使用模糊分组转换 - 这是您的示例的结果。

fuzzygroup01

结果按_key_out分组,“原始”行由_key_in = _key_out标识。如果_key_out <> _key_in该行与前一行类似,则可以设置最小相似度,分隔符,区分大小写等。

答案 1 :(得分:1)

Full-Text Search是你最好的选择。由于需要计算的咕噜声,在任何非平凡大小的文本语料库中使用Levenshtein很快就会成为问题。使用LD / SOUNDEX等更常见的是基于字符的差异而不是基于单词的差异。假设单词至少正确拼写,FTS将更适合。我还可以想象一种使用FTS识别可能匹配候选者的双层方法,在过滤集上执行更细粒度的匹配。如果你真的想去城里,那么搜索文本的性能最好的结构之一是Trie,但这在表中实现很棘手,并且作为内存数据结构更好。基于单词的n-gram解决方案也可能值得研究。

答案 2 :(得分:0)

您可能想要调查两个T-SQL函数SoundEx()Difference()。这些可能对你有用。