1.我试图找到我的表中的所有行,其中某个列是重复的。并通过每行具有的唯一id
列来标识它们。
1.我想删除他们,只留下一个副本(行),这并不重要。(如果它可以通过SQL,这是首选,如果注意,我会编码它。)
(我在用workbench)
我试过这个:
SELECT
*
FROM
table_name
GROUP BY `field_name`
HAVING COUNT(*) > 1;
它失败了。
我的第一个问题是sql_mode=only_full_group_by
,所以我通过向查询添加字段名来修复它。它工作了...嗯,算是吧。从现在起,我只看到聚合结果,没有id
列。
SELECT
field_name
FROM
table_name
GROUP BY `field_name`
HAVING COUNT(*) > 1;
所以,我来了...我该怎么做?
2条答案
按热度按时间pgky5nke1#
如果我没理解错的话,你可以使用窗口函数:
对于每一行,子查询执行窗口计数,计算有多少行共享相同的
field_name
值。然后,外部查询筛选field_name
不唯一的行。请注意,这需要MySQL 8.0。在早期版本中,替代方法使用
exists
:fzwojiic2#
如果我没理解错的话,我会用一个子查询来完成这个任务。内部查询会找到所有重复的列名。从该查询中获取列名,然后将其传递给外部查询,以找到这些列名的对象id。
您正在为此查询使用系统表,这些表有时具有提升的权限。
我刚刚读到你在使用MySQL,这个查询在MS SQL中工作,所以它可能不完全像写的那样工作,但是我认为这个概念是坚实的,所以我会发布它。