MySQL -如何找到重复行,基于单列?

qvtsj1bj  于 2023-03-11  发布在  Mysql
关注(0)|答案(2)|浏览(110)

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;

所以,我来了...我该怎么做?

pgky5nke

pgky5nke1#

如果我没理解错的话,你可以使用窗口函数:

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
)
fzwojiic

fzwojiic2#

如果我没理解错的话,我会用一个子查询来完成这个任务。内部查询会找到所有重复的列名。从该查询中获取列名,然后将其传递给外部查询,以找到这些列名的对象id。
您正在为此查询使用系统表,这些表有时具有提升的权限。
我刚刚读到你在使用MySQL,这个查询在MS SQL中工作,所以它可能不完全像写的那样工作,但是我认为这个概念是坚实的,所以我会发布它。

--outer query
SELECT 
    object_id
  , name
FROM    
  sys.columns c
WHERE name in (
--Inner Query
    SELECT  Name
    FROM
        sys.columns o
     GROUP BY Name
    HAVING COUNT(*) > 1
) 
ORDER BY 2

相关问题