【发布时间】:2019-02-12 03:56:48
【问题描述】:
表 A 的记录具有重复的实体和细微的字符串变化。没有唯一的键可以唯一地标识一个实体。字段“ID”标识表内的记录,而不是实体本身。
TABLE A
--------------
ID;SomeString
1;something1
2;something2
3;something3
通过使用模糊匹配软件,将表A与自身进行模糊匹配,以检测重复记录。查找表 B 就是这样创建的,它有两列:ID1 和 ID2,表示表 A 中匹配记录的 ID。
TABLE B
---------
ID1;ID2
1;2
1;3
2;1
2;3
3;1
3;2
去重的结果是从表 A 中删除记录 2 和 3,从而只保留第一条记录。
TABLE A
--------------
ID;SomeString
1;something1
有没有办法通过SQL来执行表A的这种模糊匹配去重,通过使用表B作为识别重复记录的模糊匹配查找表? 澄清一下,我不是要求一种方法来进行模糊匹配或识别重复项,它已经完成并且结果在表 B 中。我问的是如何删除重复项(并为每个已识别的重复记录保留一条记录组),根据已识别的重复记录对(每个同一实体有多个重复记录对)。
【问题讨论】:
-
您是在问是否有办法在 SQL 中实际进行模糊匹配(也许,但有更好的工具),或者是否有办法使用 结果 你的模糊匹配(在表 B 中)来处理删除(是的,很容易)?
-
如果相似值遵循某种一致的模式,您可以使用带有一些通配符 (
%) 值的LIKE运算符来查找相似值。表 B 的一个问题是您有镜像值,例如 1;2 和 2;1。如果您清理它以删除此类重复项,则可以根据表 B 中 ID2 的值删除表 A 中的行。 -
您使用的是什么 DBMS?您需要定义究竟是什么构成了模糊匹配。它是否共享 90% 的字符、相等的连续字符超过 90% 的字符串长度、非数字字符匹配等等……我不是词源学家,但我敢打赌,所谓的“模糊”逻辑是故意暗示歧义。如果您打算在 SQL 中执行此操作,您的目标需要明确。
-
我不是要求一种方法来进行模糊匹配,它已经完成并且结果在表 B 中。我要求一种方法来根据表 A 执行删除重复项确定的重复项(表 B 中的结果)。使用什么 DBMS 真的不相关,我的问题是关于 SQL 的一般性问题。
-
@zlatko 哪个 DBMS 可能是相关的,因为它们每个都实现了稍微不同的功能,所以可能有一个函数可以在一个 DBMS 中很好地处理它,而在另一个 DBMS 中没有实现。在这种情况下,我相信可以使用相当简单的
CASE语句来解决,但情况可能并非总是如此,即使它看起来像是一个一般的 SQL 问题。
标签: sql duplicates fuzzy-comparison