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

标签 mysql sql sql-server

好吧,我一直在试图解决这个问题,但让我感到痛苦的是,解决方案非常简单,但我只是无法通过谷歌或通过此网站找到答案。

所以... 我有一个表,通过记录两个项目记录各自的主键将它们关联在一起;该表有自己的标识列来为每个记录维护单独的键。

例如:

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/

相关文章:

使用两个连接的列将 MySQL 组连接转换为 Postgres

sql - Access 中的大小写表达式

mysql - SELECT ... FROM ... INNER JOIN ... ON 之后的结果处理

SQL Server、ISABOUT、加权项

php - SUM 查询或遍历对象数组并对数据成员求和会更有效吗?

mysql - 移动平均线 - MySQL

mysql - Mac 操作系统 : MySQL gem install fail (RoR)

php - 当另一个表中不存在某些内容时执行此查询

sql - 如何在SQL Server中转义反斜杠

sql - 在sql中将每月值与每日值连接起来