日期:2014-05-16  浏览次数:20454 次

删除数据表中重复记录
删除数据表中重复记录

Pet表结构及数据如下(要求删除字段"petName"相同的记录,保留最新一条即可):

+----+---------+---------+

| id | petName | petType |

+----+---------+---------+

|  1 | DODO    | cat     |

|  2 | MOMO    | cat     |

|  3 | WQWQ    | cat     |

|  4 | DODO    | cat     |

|  5 | WQWQ    | cat     |

|  6 | MOMO    | cat     |

+----+---------+---------+

6 rows in set



删除后结果:

+----+---------+---------+

| id | petName | petType |

+----+---------+---------+

|  1 | DODO    | cat     |

|  2 | MOMO    | cat     |

|  3 | WQWQ    | cat     |

+----+---------+---------+



1、not in方式

Delete from t_pet where id not in( select id from t_pet group by petName );

保留重复记录的最后(最新)一条:

Delete from t_pet where id not in( select max(id) from t_pet group by petName );



注:在mysql数据库里上面的方法不可行,会抛出一个1093 - You can't specify target table 't_pet' for update in FROM clause 的错误,(+﹏+)。解决方案之一:我采用的创建临时表的方式,也就是先把查询出来的非重复记录的id放到临时表里,然后再删除,如:

① Drop table if exists temp_pet;

② Create temporary table select max(id) from t_pet group by petName;

③ Delete from t_pet where id not in ( select * from temp_pet );

这里也可以写一个存储过程来实现。



2、Left join 方式

Delete a from t_pet a left join ( select * from t_pet group by petName ) b on a.id = b.id where b.id is null;

以上方式mysql数据库同样有效。

分步骤说明下:

先看left join 查询语句得到的结果是:



+----+---------+---------+------+---------+---------+

| a.id | a.petName | a.petType | b.id   | b.petName | b.petType |

+----+---------+---------+------+---------+---------+

|  4 | DODO    | cat     | NULL | NULL    | NULL    |

|  5 | WQWQ    | cat     | NULL | NULL    | NULL    |

|  6 | MOMO    | cat     | NULL | NULL    | NULL    |

+----+---------+---------+------+---------+---------+

至于为啥是这个结果不用我说了吧,以上结果就是重复的记录,可以对照上面的总表比对下!



最后当然就是删除这些记录,因为b.*字段全为null,所以删除a.*字段即可,剩下的就是非重复记录了,如下:

+----+---------+---------+

| id | petName | petType |

+----+---------+---------+

|  1 | DODO    | cat     |

|  2 | MOMO    | cat     |

|  3 | WQWQ    | cat     |

+----+---------+---------+





好了,这里就介绍这两种方法,当然还有很多方法来实现重复记录的删除,有兴趣大家可以网上看看,很多好心人总结了一些不错的方法!
<!--EndFragment-->

<!--EndFragment-->