sql - Oracle,如何从表中删除几乎相同的行

标签 sql oracle plsql oracle11gr2

多年来,由于拼写错误,我们的数据表中添加了一些重复项。因此,例如有人拼错了名字,而不是 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/

相关文章:

sql - Oracle 更新生产数据库

java - 如果一条记录插入失败,如何让Preparedstatement.executeBatch() 为好记录工作

oracle - Oracle中存储过程的object_id存储在哪里?

mysql - 我想在我的架构上添加这个约束

只有两列的 SQL Pivot

sql - 在不引用双表的情况下在 Oracle 中从无选择?

oracle - Oracle VARCHAR 列上的数字比较如何工作?

stored-procedures - 通过调度程序作业将参数传递给oracle存储过程

sql - 使用 REGEXP_EXTRACT 获取域和子域

java - 从 sql 创建 Hibernate Criteria 语句