好吧,我一直在试图解决这个问题,但让我感到痛苦的是,解决方案非常简单,但我只是无法通过谷歌或通过此网站找到答案。
所以... 我有一个表,通过记录两个项目记录各自的主键将它们关联在一起;该表有自己的标识列来为每个记录维护单独的键。
例如:
PKEY RelKey1 RelKey2
1 ABC ABD
2 ABC CBH
3 CBH DFT
4 ABD ABC
现在,我的问题是记录 1 和 4。这些记录本质上是重复的,虽然很容易阻止用户通过数据输入输入重复项;未对我从中迁移数据的现有项目执行此验证。不幸的是,我在导入数据后遇到了这个问题,不过,这并不是什么大问题,因为它是测试环境,而且可疑数据很容易识别,并且可以整体删除; “relkey”引用另一个表中的键,因此我可以根据其他参数删除所有这些记录,然后再次尝试迁移。
我正在寻找一种方法:
- 删除两条“重复”记录之一
- 或者,我可以删除所有新添加的数据并运行插入操作,仅插入两个“重复”记录之一
对于我的一生,我无法弄清楚这个问题;我已经删除了我尝试过的所有内容,因为我只需查看它就知道它不会起作用。
最佳答案
可以通过以下逻辑删除记录:仅删除记录relkey1 > relkey2
以及相应的记录relkey1 < relkey2
存在。
在标准 SQL 中,您可以将其写为:
delete from atable t
where t.relkey1 > t.relkey2 and
exists (select 1 from atable t2 where t2.relkey2 = t.relkey1 and t2.relkey1 = t.relkey2);
MySQL 不支持此语法,因此您执行以下操作:
delete t
from atable t join
(select least(relkey1, relkey2) as key1, greatest(relkey1, relkey2) as key2
from atable t2
group by least(relkey1, relkey2) as key1, greatest(relkey1, relkey2)
having count(*) > 1
) tdup
on t.relkey1 = tdup.relkey2 and t.relkey2 = tdup.relkey1;
关于mysql - SQL根据列之间交换的两个键查找重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298343/