先简述遇到的问题:我要删除一张表的数据,先是查询到所有的重复的数据id直接进行删除操作,但是一直执行不完(一直执行就是删除不完)
DELETE FROM table WHERE id IN (
?? ?SELECT MAX(id) id from table?
?? ?where rId is not null and vId is not null GROUP BY rtId,vId HAVING COUNT(*) >1
?? ?)
删除标题重复的旧记录。(居然要加这么多层,还需要在里面加一个别名才可以。)
delete from theTable where id in
(
select id from
(
select min(id) id from theTable group by title HAVING count(*)>1
) ids
) ;
CREATE TABLE bus_mark_plat_ver_tmp LIKE bus_mark_plat_ver;
INSERT INTO bus_mark_plat_ver_tmp
SELECT MAX(id) AS id,sys_code,version_code,mark_id
FROM mng_navigation_banner_plat_ver
GROUP BY sys_code, version_code, mark_id;
delete from bus_mark_plat_ver
INSERT INTO bus_mark_plat_ver
SELECT id,sys_code,version_code,mark_id
FROM mng_navigation_banner_plat_ver_tmp;
DROP TABLE bus_mark_plat_ver_tmp;
创建临时表的优点:
创建临时表的缺点:
DELETE t1
FROM
bus_mark_plat_ver t1
LEFT JOIN ( SELECT MAX( id ) AS max_id, sys_code, version_code, mark_id FROM bus_mark_plat_ver GROUP BY sys_code, version_code, mark_id ) t2 ON t1.sys_code = t2.sys_code
AND t1.version_code = t2.version_code
AND t1.mark_id = t2.mark_id
AND t1.id = t2.max_id
WHERE
t2.max_id IS NULL;
这个查询将根据sys_type、bus_type和mark_type进行分组,并保留每个组中的最大id。然后,它使用左连接将原始表与这些最大id进行比较。如果连接失败(即max_id为NULL),则表示该行不是具有最大id的行,因此将被删除。
LEFT JOIN的优点:
LEFT JOIN的缺点:
DELETE
FROM
bus_mark_plat_ver t1
WHERE
id NOT IN ( SELECT max_id FROM ( SELECT MAX( id ) AS max_id FROM bus_mark_plat_ver GROUP BY sys_code, version_code, mark_id ) tmp );
NOT IN的优点:
NOT IN的缺点:
根据具体情况选择最合适的方法。如果性能和存储空间是主要关注点,并且查询逻辑相对简单,可以考虑使用 LEFT JOIN 或 NOT IN 来处理重复数据。如果可读性和操作灵活性更重要,并且处理逻辑相对复杂,创建临时表可能是更好的选择。无论使用哪种方法,请务必在生产环境之前进行充分的测试和验证。我们在此推荐使用第二种方法来删除重复数据。