我试图查找表中某一列重复的所有行。并通过每行具有的唯一
id
列来标识它们。我想删除它们并只保留一份(行),哪一份并不重要。 (如果可以通过SQL完成,则优先,如果注明,我会编码它..)
(我正在使用工作台)
我尝试过这个:
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;
所以,我来了.. 我该怎么做?
最佳答案
如果我没听错的话,你可以使用窗口函数:
select *
from (
select t.*, count(*) over(partition by field_name) cnt
from mytable t
) t
where cnt > 1
对于每一行,子查询都会进行窗口计数,计算有多少行共享相同的 field_name
值。然后,外部查询会筛选 field_name
不唯一的行。
请注意,这需要 MySQL 8.0。在早期版本中,替代方案使用 exists
:
select *
from mytable t
where exists (
select 1
from mytable t1
where t1.field_value = t.field_value and t1.id != t.id
)
关于MySQL - 如何根据单列查找重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75675976/