一、使用情况
当测试数据库中,有重复数据会导致selectOne报错时,确认是数据错误的问题后,可以使用这句sql,只保留id最小的一条数据,删除其余的重复数据。
二、Eg
id | name | openid
1 | 张三 | 2_0_10001234
2 | 张三 | 2_0_10001234
3 | 张三 | 2_0_10001234
其中,有3条openid重复的数据;
现在要删掉重复的、只留下id最小的1条,如下:
id | name | openid
1 | 张三 | 2_0_10001234
三、sql样例------可复制直接替换表和重复字段即可
delete from employee where id in (
select a.aid from (
select id as aid from employee
where openid in (
select openid from employee group by openid having count(*)>1
)
) a left join (
select min(id) as bid from (
select id,openid from employee
where openid in (
select openid from employee group by openid having count(*)>1
)
) t group by openid
) b on a.aid=b.bid where b.bid is null
)
四、说明
1.首先按openid分组,查询出>1的id;
2.然后使用min(id)与group by openid,得到大于1的id集合中最小的id;
3.然后使用left join,得到按openid分组后、大于1的id集合中、除了每组最小id后的剩余的id;
4.最后使用delete与in,删除目标id行;
5.这样就实现了,删除表中openid重复的数据、同时保留重复数据中每组id最小的那行。