SQL Server中如何删除重复记录 仅保留值为1的单条记录
SQL Server 全同值重复记录去重操作方案
核心逻辑
本方案对应场景:表中存在多行所有字段值均为1的重复数据,需要仅保留1条,其余冗余行全部删除。实现上依托SQL Server内置的ROW_NUMBER()窗口函数识别完全重复的行,仅删除组内排序靠后的冗余记录即可。
操作前置要求
- 正式执行删除前必须对目标表做全量备份,避免误删无法恢复
- 先通过查询语句核验待删除的记录范围,确认匹配规则后再执行删除操作
- 如果表存在自增主键/唯一标识列,建议依托主键固定保留目标行,避免随机保留带来的不可控问题
分步实现流程
1. 快速获取表全字段名(避免手动列字段遗漏)
如果表字段数量较多,可通过系统视图直接拼接全字段清单,无需手动逐字段输入:
-- 替换YourTableName为实际操作的表名 SELECT STRING_AGG(COLUMN_NAME, ', ') AS all_table_columns FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName';
将查询返回的字段串,直接替换到后续代码中PARTITION BY后面的位置即可。
注:如果使用的是SQL Server 2016及更低版本,不支持
STRING_AGG函数,可手动从表设计器中复制全字段清单,或通过FOR XML PATH方式拼接字段字符串。
2. 核验待删除冗余范围
先执行查询,确认筛选出的记录完全符合删除规则:
-- 替换代码中的表名、字段为实际值 SELECT * FROM ( SELECT *, -- 按全字段分组识别完全重复的行 ROW_NUMBER() OVER ( PARTITION BY 字段1, 字段2, 字段3 ORDER BY 主键列 -- 无主键时可写为 ORDER BY (SELECT 1) ) AS row_rank FROM YourTableName ) matched_rows -- 仅筛选重复组内、且所有字段值均为1的冗余行 WHERE row_rank > 1 AND 字段1 = 1 AND 字段2 = 1 AND 字段3 = 1;
3. 执行删除操作
确认查询结果无误后,使用公共表表达式直接删除匹配的冗余行:
-- 替换代码中的表名、字段为实际值 WITH repeat_rows AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY 字段1, 字段2, 字段3 ORDER BY 主键列 ) AS row_rank FROM YourTableName ) DELETE FROM repeat_rows WHERE row_rank > 1 AND 字段1 = 1 AND 字段2 = 1 AND 字段3 = 1;
结果校验
删除完成后可执行校验查询,确认所有字段值为1的记录仅保留1条:
SELECT COUNT(*) AS remaining_count FROM YourTableName WHERE 字段1 = 1 AND 字段2 = 1 AND 字段3 = 1;
若返回值为1,即说明去重操作符合预期。
内容的提问来源于stack exchange,提问作者ankit giri
相关产品推荐
相关产品推荐

