好的,我一直在努力弄清楚这个问题,让我觉得解决方案非常简单但是我无法通过谷歌或者通过这个网站找到答案。
所以... 我有一个表,通过记录他们各自的主键,将2个项目记录放在一起;此表有自己的标识列,以便为每个记录维护单独的密钥。
例如:
PKEY RelKey1 RelKey2
1 ABC ABD
2 ABC CBH
3 CBH DFT
4 ABD ABC
现在,我的问题是记录1和4.这些记录基本上是重复的,虽然很容易阻止用户通过数据输入输入重复记录;我没有对从中迁移数据的现有项目执行此验证。不幸的是,我在导入数据之后遇到了这个问题,但是它对于测试环境来说并不是什么大不了的事,而且可疑数据很容易识别并且可以作为一个整体删除; 'relkey'指的是另一个表中的键,所以我可以根据其他参数删除所有这些记录,然后再次尝试迁移。
我正在寻找一种方法:
对于我的生活,我无法弄明白这一点;我尝试过的所有内容都已删除,因为我只能看一下它,并知道它不起作用。
答案 0 :(得分:2)
您可以使用以下逻辑删除记录:仅删除记录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;