如何使用SQL删除具有相同id值的重复行?
删除SQL表中重复id行的解决方案
根据你的需求——保留每个id对应的唯一一行记录,以下是不同SQL数据库的可行方案:
MySQL 场景
方案1:通过自增/唯一列关联删除
假设表存在唯一标识列(比如自增列row_id),可以用JOIN方式删除重复项,保留row_id最小的那一行:
DELETE t1 FROM your_table t1 JOIN your_table t2 ON t1.id = t2.id AND t1.row_id > t2.row_id;
方案2:窗口函数(MySQL 8.0及以上)
利用ROW_NUMBER()给每个id分组的行标记序号,删除序号大于1的行:
WITH ranked_rows AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT NULL)) AS rn FROM your_table ) DELETE FROM your_table WHERE (id, rn) IN (SELECT id, rn FROM ranked_rows WHERE rn > 1);
SQL Server 场景
方案1:窗口函数直接删除
WITH ranked_rows AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT NULL)) AS rn FROM your_table ) DELETE FROM ranked_rows WHERE rn > 1;
方案2:循环删除重复项(适合低版本)
WHILE EXISTS (SELECT id FROM your_table GROUP BY id HAVING COUNT(*) > 1) BEGIN DELETE TOP (1) FROM your_table WHERE id IN (SELECT id FROM your_table GROUP BY id HAVING COUNT(*) > 1) END
通用兼容方案(无唯一列时)
如果表没有任何唯一标识列,可以通过临时表中转去重:
-- 创建临时表存储去重后的数据 CREATE TABLE temp_table AS SELECT DISTINCT * FROM your_table; -- 清空原表 TRUNCATE TABLE your_table; -- 将去重数据插回原表 INSERT INTO your_table SELECT * FROM temp_table; -- 删除临时表 DROP TABLE temp_table;
注意:执行前请务必备份数据,避免数据丢失。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

