SQL根据列之间交换的两个键查找重复记录

时间:2014-08-14 00:36:22

标签: mysql sql sql-server

好的,我一直在努力弄清楚这个问题,让我觉得解决方案非常简单但是我无法通过谷歌或者通过这个网站找到答案。

所以... 我有一个表,通过记录他们各自的主键,将2个项目记录放在一起;此表有自己的标识列,以便为每个记录维护单独的密钥。

例如:

PKEY   RelKey1  RelKey2
1       ABC      ABD
2       ABC      CBH
3       CBH      DFT
4       ABD      ABC

现在,我的问题是记录1和4.这些记录基本上是重复的,虽然很容易阻止用户通过数据输入输入重复记录;我没有对从中迁移数据的现有项目执行此验证。不幸的是,我在导入数据之后遇到了这个问题,但是它对于测试环境来说并不是什么大不了的事,而且可疑数据很容易识别并且可以作为一个整体删除; 'relkey'指的是另一个表中的键,所以我可以根据其他参数删除所有这些记录,然后再次尝试迁移。

我正在寻找一种方法:

  • 删除两个“重复”记录之一
  • 或者,我可以删除所有新添加的数据并运行一个只会插入两个“重复”记录之一的插入

对于我的生活,我无法弄明白这一点;我尝试过的所有内容都已删除,因为我只能看一下它,并知道它不起作用。

1 个答案:

答案 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;