Access中基于多字段删除重复记录并保留最低priority值的方法
在Access中删除重复记录并保留priority最低项的正确方法
错误原因分析
你原SQL语句报错是因为Access的Jet SQL不支持多字段组合直接放在NOT IN中,同时原语句的逻辑也未正确关联分组与原表的匹配关系。
正确实现方式
方法1:关联子查询直接删除
通过子查询找到当前记录对应分组的最小priority,删除所有priority大于该值的记录:
DELETE tbl.* FROM tbl WHERE tbl.priority > ( SELECT MIN(t.priority) FROM tbl AS t WHERE t.UN = tbl.UN AND t.PSN = tbl.PSN AND t.Class = tbl.Class AND t.ClassAll = tbl.ClassAll AND t.PG = tbl.PG );
注意:如果同一分组中有多条记录priority值同为最小值,此方法会保留所有这些记录。
方法2:通过主键ID筛选保留记录
如果你的表有主键(比如示例中的ID字段),可以先找出每个分组中priority最小的记录ID,再删除不在该列表中的记录,逻辑更清晰:
DELETE tbl.* FROM tbl WHERE tbl.ID NOT IN ( SELECT sub.ID FROM ( -- 先获取每个分组的最小priority值 SELECT UN, PSN, Class, ClassAll, PG, MIN(priority) AS MinPriority FROM tbl GROUP BY UN, PSN, Class, ClassAll, PG ) AS sub -- 关联原表找到对应最小priority的记录ID INNER JOIN tbl ON sub.UN = tbl.UN AND sub.PSN = tbl.PSN AND sub.Class = tbl.Class AND sub.ClassAll = tbl.ClassAll AND sub.PG = tbl.PG AND sub.MinPriority = tbl.priority );
若同一分组中有多条priority同为最小值的记录,此方法会保留所有这些记录;如果只想保留其中一条,可将子查询中的
sub.ID改为MIN(sub.ID)或MAX(sub.ID)。
重要提醒
- 执行删除前务必备份数据,避免误删;
- 可先将
DELETE tbl.*替换为SELECT tbl.*,验证查询结果是否符合预期后再执行删除操作。
内容的提问来源于stack exchange,提问作者MK01111000
相关产品推荐
相关产品推荐

