如何编写SQL脚本删除name重复、registered为true的fuelType=1行?
解决方法
要实现删除指定条件的重复行,我们可以先定位目标行的ID,再执行删除操作,以下是具体实现方案:
条件明确
需要删除的行需同时满足:
- 该行的
fuelType等于1 - 该行的
registered为true - 该行的
name在表中存在重复(即同一name对应至少两行数据)
实现SQL
方法一:子查询定位目标行
DELETE FROM cars WHERE id IN ( SELECT id FROM cars WHERE fuelType = 1 AND registered = true AND name IN ( SELECT name FROM cars WHERE fuelType = 1 GROUP BY name HAVING COUNT(*) > 1 ) );
方法二:窗口函数标记重复行
如果你的数据库支持窗口函数(如MySQL 8.0+、PostgreSQL、SQL Server等),可以用更直观的方式:
WITH duplicate_rows AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS row_num FROM cars WHERE fuelType = 1 ) DELETE FROM cars WHERE id IN ( SELECT dr.id FROM duplicate_rows dr JOIN cars c ON dr.id = c.id WHERE dr.row_num > 1 AND c.registered = true );
关于示例的补充说明
根据你提供的表格数据,fuelType=1的行中没有name重复的记录(Abarth、Aston Martin、Bentley各仅一行),所以上述SQL执行后不会删除任何行。如果你的示例中id=11的行需要被删除,可能是条件中的fuelType=1应为fuelType=2,修改后的SQL如下:
DELETE FROM cars WHERE id IN ( SELECT id FROM cars WHERE fuelType = 2 AND registered = true AND name IN ( SELECT name FROM cars WHERE fuelType = 2 GROUP BY name HAVING COUNT(*) > 1 ) );
执行此SQL后,id=11的Ferrari行(registered=true且name重复)会被删除,符合你的示例预期。
内容的提问来源于stack exchange,提问作者densal03
相关产品推荐
相关产品推荐

