使用SQL语句完成数据表的去重工作

 

引入问题

      可能大家都遇到过这样一种情况,一张表存在若干行数据,只是主键值相同,但是其它字段都是相同的,这就是我们通常所说的数据库重复数据,那我们是如何将这些数据删除呢?现在我们就介绍一种方法来实现数据库数据的去重工作。

模拟问题环境

     首先我们需要模拟一下业务环境,创建一张数据表,里面字段不用多,我们设置为四个,分别为:id,name,age,content。并为这张表插入所需的数据。

解决思路

     我们需要删除重复的数据,但是又不能全部删除,这该如何实现呢?

     我们需要先查询出需要保留的数据ID,然后通过Delete语句删除ID不再这个集合中的数据。现在重点来了,到底如何取出重复数据中其中一个ID呢?这时SQL语句给我们给出了Group By语句,它通过指定字段进行分组,我们只需要通过下面这个语句,就可以查询出重复数据中的一个。

select id from user group by name,age,content

执行结果:

    走到这一步,问题就已经解决了一大半了。我们现在只需要根据查询出来的ID集,删除不在这个集合中的元素即可。

delete from user where id not in (select id from user group by name,age,content)

执行后查看user表:

       可以看到,原先重复的数据已经被删除了。

可能出现的问题

       但是如果是使用MySQL数据库的博友,在执行这句话的时候会出现以下错误:

      这是因为MySQL不能先select出同一表中的某些值,再update这个表(在同一语句中)。我们可以通过一个“中间表”来解决这个问题。

      示例:

delete from user where id not in (select id from (select id from user group by name,age,content) t)

总结

     我们是先查询出需要保留的数据,然后通过delete语句删除除了保留数据的其他数据。

posted @ 2018-12-07 14:51  听到微笑  阅读(5)  评论(0编辑  收藏  举报  来源