sql删除重复数据且只保留一条?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql删除重复数据且只保留一条?相关的知识,希望对你有一定的参考价值。

图片是我查询出来的重复数据。我想把数据库内的所有重复记录都删除,且只保留一条,请帮我写出详细语句,我是小白,谢谢

参考技术A 这个简单,凡是重复的保留一个就可以了,是这个意思吧。
那么就是 select min(id) from table group by title这样的就能查出来每个title的最小的id,就算有重复的,也能显示出来最小的id,如果没有重复,那么这条语句也会得到唯一的id
然后where id not in(上面的语句)
这样就可以找到所有的不在上面语句朝招范围内的语句,比如id为2732,2733,2734这三条,那么上面的语句查出来的id就是2732,下面这个not in能查出来的就是2733和2734,然后再用delete删除就可以了。
当然min(id)也可以用max(id)效果是一样的,只是保留的id变成了2734
不过这里有一个问题,那就是title字段重复,整个行都重复吗?如果能确认整行重复,那么这条语句基本没问题,如果不能确定,那么就还需要再考虑才可以。
参考技术B 在你的查询sql里面将子查询的title改成id,外面用id in(),这样会得到去重后的数据导出insert语句,将表中数据备份删除,再将导出的sql执行一下即可,还有一种就是写删除sql,delete from table where id not in(select id from table group by title )。

SQL删除重复数据只保留一条数据

1、表结构与数据:

CREATE TABLE tablezzl(
id int,
name VARCHAR(255)
);

2、查询出重复的数据:

SELECT name FROM tablezzl GROUP BY name HAVING COUNT(name)>1

3、查询出要保留的重复数据:

SELECT MIN(id) ids FROM tablezzl GROUP BY NAME HAVING COUNT(name)>1

4、最终的SQL:

DELETE FROM tablezzl 
WHERE 1=1
    AND `name` in (SELECT * FROM ( (SELECT `name` `names` FROM tablezzl GROUP BY name HAVING COUNT(`name`)>1) ) a)
    AND id not in (SELECT * FROM ( (SELECT MIN(id) ids FROM tablezzl GROUP BY NAME HAVING COUNT(`name`)>1) ) b)

5、补充 : 

  其中这样写mysql中不能如下这样写:

DELETE FROM tablezzl 
WHERE 1=1
AND `name` in (SELECT `name` `names` FROM tablezzl GROUP BY name HAVING COUNT(`name`)>1) 
AND id not in (SELECT MIN(id) ids FROM tablezzl GROUP BY NAME HAVING COUNT(`name`)>1) 

会报错:You can\'t specify target table \'tablezzl\' for update in FROM clause,不能在同一表中查询的数据作为同一表的更新数据,如模块4的SQL包装一下就可以解决。

 

以上是关于sql删除重复数据且只保留一条?的主要内容,如果未能解决你的问题,请参考以下文章

数据库怎样删除多条重复数据保留一条?

SQL删除重复数据只保留一条

SQL删除重复数据只保留一条

SQL删除重复数据只保留一条数据

SQL删除重复数据只保留一条

SQL删除重复数据只保留一条