请求提供删除数据集重复行的查询语句
删除数据集重复行的SQL查询方案
没问题,针对你手里这个有重复行的数据集,我给你整理了几种常用SQL数据库下删除重复行的方案,你可以根据自己使用的数据库类型来选:
先确认去重结果(仅查询不删除)
如果你只是想先查看去重后的数据集,而不实际删除原表中的重复行,可以用DISTINCT关键字:
SELECT DISTINCT DivID, Account_Code, Name FROM your_table_name;
把your_table_name替换成你的实际表名即可,这条语句会返回所有不重复的记录。
实际删除重复行(保留每组重复中的一条)
下面分不同数据库给出具体的删除语句:
MySQL/MariaDB
方法1:使用窗口函数(MySQL 8.0+ 支持)
这种方法更清晰,适合没有唯一主键的表:
WITH cte AS ( SELECT DivID, Account_Code, Name, -- 按重复字段分组,给每组的行编号 ROW_NUMBER() OVER (PARTITION BY DivID, Account_Code, Name ORDER BY (SELECT NULL)) AS rn FROM your_table_name ) DELETE FROM your_table_name WHERE (DivID, Account_Code, Name, rn) IN (SELECT DivID, Account_Code, Name, rn FROM cte WHERE rn > 1);
rn > 1表示删除每组中编号大于1的重复行,只保留第一条。
方法2:自连接删除(适合旧版本MySQL)
如果你的表有唯一主键(比如id列),可以用自连接的方式删除重复行:
DELETE t1 FROM your_table_name t1 JOIN your_table_name t2 ON t1.DivID = t2.DivID AND t1.Account_Code = t2.Account_Code AND t1.Name = t2.Name AND t1.id > t2.id;
这条语句会保留每组重复中id较小的那一行,删除其余重复行。
PostgreSQL
方法1:窗口函数结合ctid
PostgreSQL中可以用内置的ctid作为行的唯一标识:
WITH cte AS ( SELECT ctid, ROW_NUMBER() OVER (PARTITION BY DivID, Account_Code, Name ORDER BY ctid) AS rn FROM your_table_name ) DELETE FROM your_table_name WHERE ctid IN (SELECT ctid FROM cte WHERE rn > 1);
方法2:USING关键字删除
同样利用ctid来区分重复行:
DELETE FROM your_table_name t1 USING your_table_name t2 WHERE t1.DivID = t2.DivID AND t1.Account_Code = t2.Account_Code AND t1.Name = t2.Name AND t1.ctid > t2.ctid;
SQL Server
使用窗口函数是最常用的方式:
WITH cte AS ( SELECT DivID, Account_Code, Name, ROW_NUMBER() OVER (PARTITION BY DivID, Account_Code, Name ORDER BY (SELECT NULL)) AS rn FROM your_table_name ) DELETE FROM cte WHERE rn > 1;
重要提醒
- 执行删除操作前一定要备份数据,或者先把
DELETE语句换成SELECT *来验证要删除的行是否正确,避免误删。 - 把所有语句中的
your_table_name替换成你实际的表名。
内容的提问来源于stack exchange,提问作者Manwith1eye
相关产品推荐
相关产品推荐

