Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle,如何从表中删除几乎相同的行_Sql_Oracle_Plsql_Oracle11gr2 - Fatal编程技术网

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

Sql Oracle,如何从表中删除几乎相同的行,sql,oracle,plsql,oracle11gr2,Sql,Oracle,Plsql,Oracle11gr2,多年来,由于拼写错误,我们的数据表中增加了一些重复项。例如,有人拼错了名字,而不是奥利里写了奥利里。我们的系统认为它是一个完全不同的名字,并没有抱怨它,但在大多数情况下,它是相同的联系人输入两次(我没有建立这个系统) 现在我想做的是删除所有这些重复项,但我很难构建一个查询来显示它们。我做了UTL_匹配的实验,并编写了一个查询,如果我提供名称,将返回所有相似的名称 select first_name from customers where UTL_MATCH.edit_distance_sim

多年来,由于拼写错误,我们的数据表中增加了一些重复项。例如,有人拼错了名字,而不是奥利里写了奥利里。我们的系统认为它是一个完全不同的名字,并没有抱怨它,但在大多数情况下,它是相同的联系人输入两次(我没有建立这个系统)

现在我想做的是删除所有这些重复项,但我很难构建一个查询来显示它们。我做了UTL_匹配的实验,并编写了一个查询,如果我提供名称,将返回所有相似的名称

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 join
     customers c2
     on UTL_MATCH.edit_distance(c1.first_name, c2.first_name) <= 3
order by c1.first_name;
选择c1.first\u name,c2.first\u name
来自客户c1加入
客户c2

在UTL_匹配上,编辑距离(c1.名字,c2.名字)这样的技术上可行

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 CuuleSudiID> C1。CuuleSeriID < /代码>将是另一个合理的过滤器,假设您不需要每一对复制(即,“KuSTin /贾斯廷”行可以不存在等效的“贾斯廷/KuSTin”行)。 我只想在join子句中添加一个
和c1.first\u name
,以避免无用的重复(和精确匹配),谢谢您的回答!我尝试过一种非常类似的方法,5分钟后不得不取消我的查询,它仍在运行,我认为我的代码有问题。有没有办法提高它的速度?@K.I。从表格的一小部分开始,比如以“a”开头的名字,看看结果如何。谢谢你的回答!我尝试过一种非常类似的方法,5分钟后不得不取消我的查询,它仍在运行,我认为我的代码有问题。有没有办法提高它的速度?@K.I-就像我说的,将表中的每一行与表中的每一行进行比较会非常慢。你需要想出一些合理的方法来限制你需要根据你的数据的知识来考虑的组合。我提到了一些对你来说可能合理也可能不合理的可能性。不幸的是,很难猜测对您的数据来说什么是合理的启发式方法。例如,您的客户可能有地址信息,您只能比较同一邮政编码中的客户。或者你可以让它在一夜之间运行几个小时。问题陈述中存在逻辑上的不一致。可以有三个名字,分别称为fn1、fn2、fn3,fn1和fn3都与fn2“非常相似”,但彼此“非常相似”。在这种情况下,您可以保留fn2并移除另外两个,也可以保留fn1和fn3,但移除中间的一个。然后fn3可能与fn4相似,但fn4与fn1“不够”相似,等等。在考虑任何解决方案之前,你需要一份更明确的问题陈述。很抱歉,mathguy可能是我们智商水平之间的差异造成了阻碍(我不明白你刚才说的话),然而,我尽我所能尽可能简单地解释我的问题,我看到下面的一些答案几乎回答了我的问题,所以我似乎没有完全失败。但谢谢你的意见。举例说明:同一个名字的三个不同版本,拼写不同(无论出于何种原因),但却是同一个人。名字叫贾达、杰达或格达。“相似”是多少个字母的共同点。JADA和JEDA的相似性为75%(超过60%),JEDA和GEDA的相似性也为75%,但JADA和GEDA的相似性仅为50%。如果您使用您的查询,并且在您使用“JEDA”的距离内,将选择其他两个名称。但如果使用“JADA”进行比较,则不会选择“GEDA”。因此,“所有重复项”的概念没有得到很好的定义。按照同样的逻辑,如果应用“我朋友的朋友就是我的朋友”,您可能会遇到这样的情况:ABC类似于DBC,它类似于DEC,它类似于DEF。这是否意味着ABC与DEF相似?哈!现在我明白了:)谢谢!我认为,如果要实现您的想法,下面所述的查询将变得更加高效,但也许这次没有必要,因为我可以完成工作,而且我只需要做一次,因此速度并不那么重要。