如何基于flight_number和date两列删除flights表中的重复数据
Flights表重复数据删除SQL方案
核心逻辑:利用表自带的唯一id列,对flight_number和date相同的分组,保留其中一条记录(默认保留id最小的最早插入记录,需要保留最新的可自行调整函数)。
通用写法(兼容绝大多数数据库)
DELETE FROM flights WHERE id NOT IN ( SELECT MIN(id) FROM flights GROUP BY flight_number, `date` );
如果使用MySQL出现「不能在子查询中引用正在更新的表」的报错,可以嵌套一层临时表规避:
DELETE FROM flights WHERE id NOT IN ( SELECT id FROM ( SELECT MIN(id) AS id FROM flights GROUP BY flight_number, `date` ) AS tmp );
自连接写法
DELETE f1 FROM flights f1 INNER JOIN flights f2 ON f1.flight_number = f2.flight_number AND f1.`date` = f2.`date` AND f1.id > f2.id;
注意事项
- 执行删除前建议先运行查询语句确认待删除数据是否符合预期:
SELECT * FROM flights WHERE id NOT IN ( SELECT MIN(id) FROM flights GROUP BY flight_number, `date` );
- 若需要保留每个分组中最新插入的记录,将上述语句中的
MIN(id)改为MAX(id),自连接语句中的f1.id > f2.id改为f1.id < f2.id即可。
内容的提问来源于stack exchange,提问作者Nish Dekardo
相关产品推荐
相关产品推荐

