多年来,由于拼写错误,我们的数据表中添加了一些重复项。因此,例如有人拼错了名字,而不是 O'leary 写了 Oleary。我们的系统认为它是一个完全不同的名字并且不会提示它,但是在大多数情况下它的同一个联系人输入了两次(我没有构建这个系统)。
现在我想做的是删除所有这些重复项,但我很难构建一个查询来显示它们。我对 UTL_MATCH 进行了试验,并编写了一个查询,如果我提供名称,该查询将返回所有相似的名称。
select first_name from customers
where UTL_MATCH.edit_distance_similarity(first_name,'Oleary') > 60
order by first_name;
但是我想构建一个查询,它可以自动返回所有可能的重复项,而无需提供名称。谁能指出我正确的方向?
最佳答案
像这样的东西在技术上是可行的。
select c1.first_name, c2.first_name
from customers c1
cross join customers c2
where utl_match.edit_distance_similarity( c1.first_name, c2.first_name ) > 60
order by c1.first_name
但是,它会非常慢,除非您的 customers
表恰好非常(非常)小,因为您要将 customers
表中的每一行与其他行进行比较表中的行(并且您的编辑距离相似性截止值非常低)。为了加快速度,您可能不得不对数据做出假设或做一些其他可以作为初步过滤的事情。例如,如果您假设任何重复项都以相同的第一个字符或相同的前几个字符(忽略标点符号)开头,那么您可以显着减少需要匹配的对数,但可能会遗漏“Kustin”可能是第一个字符不同的“Justin”的拼写错误副本。要求 c2.customer_id > c1.customer_id
将是另一个合理的过滤器来考虑假设你不需要每对重复(即“Kustin/Justin”行可以存在而没有等效的“Justin/库斯汀”行)。
关于sql - Oracle,如何从表中删除几乎相同的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024746/