关于mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句理解
2016-10-13 14:30
816 查看
正好想写一条删除重复语句并保留一条数据的SQL,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 。如下:
表字段和数据:
SQL语句:
DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(SELECT id FROM `user` GROUP BY username)AS b)
理解:
先从里面的SQL开始看
1、SELECT id FROM `user` GROUP BY username 根据名字分组查询出每组的ID。
2、SELECT * FROM(SELECT id FROM `user` GROUP BY username) AS b 这句话中有2个疑问点,
第一、为什么要套这样一个select?因为 更新数据时使用了查询,而查询的数据又做更新的条件,mysql不支持这种方式
如果不套上这个select查询,那么将会报1093 - You can't specify target table 'user' for update in FROM clause错误。
第二、这句话中一定要取别名,不然会报1248 - Every derived table must have its own alias 错误
3、结合上面的分析来看一下整个的SQL语句理解,先将分组的ID查出来,然后删除USER表中ID 不在分组ID中的数据,那么就实现效果了。
delete from 表名 where ID not in (select * from (select id from 表名 group by 分组的列名) 别名)
效果如下:
表字段和数据:
SQL语句:
DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(SELECT id FROM `user` GROUP BY username)AS b)
理解:
先从里面的SQL开始看
1、SELECT id FROM `user` GROUP BY username 根据名字分组查询出每组的ID。
2、SELECT * FROM(SELECT id FROM `user` GROUP BY username) AS b 这句话中有2个疑问点,
第一、为什么要套这样一个select?因为 更新数据时使用了查询,而查询的数据又做更新的条件,mysql不支持这种方式
如果不套上这个select查询,那么将会报1093 - You can't specify target table 'user' for update in FROM clause错误。
第二、这句话中一定要取别名,不然会报1248 - Every derived table must have its own alias 错误
3、结合上面的分析来看一下整个的SQL语句理解,先将分组的ID查出来,然后删除USER表中ID 不在分组ID中的数据,那么就实现效果了。
delete from 表名 where ID not in (select * from (select id from 表名 group by 分组的列名) 别名)
效果如下:
相关文章推荐
- 删除oracle 表中重复数据sql语句、保留rowid最小的一条记录
- mysql 删除重复数据只保留一条sql
- mysql删除重复记录只保留一条数据
- SQL语句实现删除重复记录并只保留一条
- MySQL下删除重复记录只保留一条数据
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- oracle 查询重复数据并且删除, 只保留一条数据的SQL语句
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- mysql 删除重复数据只保留一条记录
- mysql删除重复数据只保留id最大一条记录
- Sql server 删除重复记录的SQL语句保留一条
- SQL删除重复记录,只保留一条数据。
- SQL语句删除2条重复数据一条保留一条
- SQL语句删除2条重复数据一条保留一条
- 关于SQL删除重复数据只保留一条
- SQL语句删除2条重复数据一条保留一条
- MYSQL用一条SQL语句删除重复记录
- 删除Mysql数据表中多余的重复记录的sql语句
- SQL删除重复数据只保留一条语句
- MYSQL用一条SQL语句删除重复记录