如何基于till_id与total字段删除SQL表中的完全重复行?
删除表中完全重复行的解决方案
你的查询确实只能定位到存在重复的字段组合,要删除重复行(保留每组重复中的一行),可以根据你使用的数据库选择以下方法:
通用方案(适用于几乎所有数据库)
如果你的数据库版本较低,不支持窗口函数,可以通过临时表中转:
-- 1. 创建临时表存储唯一行 CREATE TABLE temp_till_total AS SELECT DISTINCT till_id, total FROM till_total; -- 2. 清空原表 TRUNCATE TABLE till_total; -- 3. 将唯一行插回原表 INSERT INTO till_total (till_id, total) SELECT till_id, total FROM temp_till_total; -- 4. 删除临时表 DROP TABLE temp_till_total;
现代数据库方案(支持窗口函数:MySQL 8.0+、SQL Server、PostgreSQL等)
利用ROW_NUMBER()窗口函数给每个重复组的行编号,删除编号大于1的行:
MySQL 8.0+
DELETE t FROM ( SELECT till_id, total, ROW_NUMBER() OVER (PARTITION BY till_id, total ORDER BY (SELECT NULL)) AS rn FROM till_total ) t WHERE rn > 1;
SQL Server
WITH DuplicateRows AS ( SELECT till_id, total, ROW_NUMBER() OVER (PARTITION BY till_id, total ORDER BY (SELECT NULL)) AS rn FROM till_total ) DELETE FROM DuplicateRows WHERE rn > 1;
PostgreSQL
WITH DuplicateRows AS ( SELECT till_id, total, ROW_NUMBER() OVER (PARTITION BY till_id, total ORDER BY (SELECT NULL)) AS rn FROM till_total ) DELETE FROM till_total USING DuplicateRows WHERE till_total.till_id = DuplicateRows.till_id AND till_total.total = DuplicateRows.total AND DuplicateRows.rn > 1;
说明:PARTITION BY till_id, total表示按这两个字段分组,同一组的行视为重复;ROW_NUMBER()会给每组内的行分配1、2、3...的编号,删除rn>1的行就会只保留每组的第一行。
内容的提问来源于stack exchange,提问作者El Louise
相关产品推荐
相关产品推荐

