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

问题描述:

嘿,所有。我有一个有相当数量的行的MSSQL 2008数据库。到目前为止,在将新行插入表之前,存储过程会检查数据库中是否已存在该记录(通过检查标题为“标题”的列)。此检查是确切的,如果要插入的记录略有不同,它将插入它而不是更新现有的行(这是近似匹配)。我想要做的是在插入之前以某种方式检测表中的近似重复。因此,要插入一个新的记录是:使用T-SQL查找大约重复的数据库记录?

The quick brown fox jumps over the lazy dog 

将大致匹配:

Quick brown fox jumps over the lazy dog 

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

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

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

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

fuzzygroup01

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