【发布时间】:2016-10-13 23:23:18
【问题描述】:
多年来,由于拼写错误,我们的数据表中添加了一些重复项。例如,有人拼错了名字,而不是 O'leary 写了 Oleary。我们的系统认为它是一个完全不同的名字并且不会抱怨它,但是在大多数情况下它的同一个联系人输入了两次(我没有构建这个系统)。
现在我想做的是删除所有这些重复项,但是我很难构建一个查询来显示它们。我确实对 UTL_MATCH 进行了试验,并编写了一个查询,如果我提供名称,它将返回所有相似的名称。
select first_name from customers
where UTL_MATCH.edit_distance_similarity(first_name,'Oleary') > 60
order by first_name;
但是,我想构建一个查询,该查询将自动返回所有可能的重复项,而无需提供名称。谁能指出我正确的方向吗?
【问题讨论】:
-
问题陈述存在逻辑不一致。可以有三个名字,分别称它们为 fn1、fn2、fn3,其中 fn1 和 fn3 都与 fn2“足够相似”,但彼此不“足够相似”。在这种情况下,您可以保留 fn2 并删除其他两个,或者您可以保留 fn1 和 fn3 但删除中间的一个。然后 fn3 可能与 fn4 相似,但 fn4 与 fn1 的“足够”相似,等等。在考虑任何解决方案之前,您需要一个更明确的问题陈述。
-
对不起,mathguy,也许我们的智商水平之间的差异妨碍了我(我不明白你刚才说的是什么),但是我尽我所能尽可能简单地解释我的问题,我在下面看到一些几乎回答了我的查询的答案,所以看来我并没有完全失败。但感谢您的意见。
-
举例说明:同名的三个不同版本,拼写不同(无论出于何种原因),但同一个人。名字是 JADA、JEDA 或 GEDA。 “相似”是多少个共同的字母。 JADA 到 JEDA 是 75%(它们相似度超过 60%),JEDA 和 GEDA 也有 75%,但 JADA 和 GEDA 只有 50% 相似。如果您使用查询并在 distance_similarity 中使用“JEDA”,则将选择其他两个名称。但是如果你使用'JADA'进行比较,'GEDA'将不会被选中。所以“所有重复”的概念没有很好的定义。
-
同理,如果应用“我朋友的朋友就是我的朋友”,你可能会有这样的情况:ABC类似于DBC,类似于DEC,即类似于 DEF。这是否意味着 ABC 类似于 DEF?
-
哈!现在我明白了:)谢谢!我认为如果要实现您的想法,下面所述的查询会变得更有效率,但也许这次不需要,因为我可以完成工作,我只需要做一次,所以速度并不那么重要.
标签: sql oracle plsql oracle11gr2