环境
Mysql版本:5.5.57
Navicate版本:15
表结构

需求是将表中有重复的记录删除,然后保留一条。id为主键且自增,因为删除语句的子查询内表相对较大,用 WHERE…IN…语句效率非常低,通过WHERE…EXISTS…语句能极大的提高效率。
代码
DELETE t1
FROM sf_Handle_day AS t1
WHERE exists(
SELECT p_index, sf_homepage, sf_IP, server_IP, id
FROM (
SELECT p_index, sf_homepage, sf_IP, server_IP, MIN(id) AS id
FROM sf_Handle_day
GROUP BY p_index, sf_homepage, server_IP
HAVING COUNT(*) > 1) t2
WHERE t1.p_index = t2.p_index
AND t1.sf_homepage = t2.sf_homepage
AND t1.sf_IP = t2.sf_IP
AND t1.server_IP = t2.server_IP
AND t1.id != t2.id
);
注意点:
- 子查询中的WHERE一定要写,并且是用t1和t2判断
- 表需要起别名,因为子查询的判断相当于操作两张表
- 起别名后DELETE后面就需要跟别名,要不然会报错
1万+

被折叠的 条评论
为什么被折叠?



