gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:55:20 25 4
gpt4 key购买 nike

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

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

例如:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com