SQL查询需求:过滤重复行保留唯一行,忽略同key重复项
解决SQL去重查询问题
问题核心
你需要保留表中所有列组合唯一的行:完全重复的行(如id=1的两条ACB3记录)只留一行,列组合不同的行(如id=2的XY4和ZZ5)全部保留。
正确解决方案
方案1:使用DISTINCT(最简洁)
直接对所有查询列去重,是实现该需求最直观的方式:
SELECT DISTINCT id, name, class, `key` FROM A;
注:key是SQL保留关键字,需用反引号(MySQL)或方括号(SQL Server)包裹,避免语法错误。
方案2:使用GROUP BY(适合后续扩展)
如果需要后续添加聚合逻辑,可按所有列分组,确保每个唯一组合仅返回一行:
SELECT id, name, class, `key` FROM A GROUP BY id, name, class, `key`;
该写法符合SQL标准,在开启ONLY_FULL_GROUP_BY模式的MySQL或其他严格模式数据库中均可正常执行。
原有查询的问题分析
- 分组维度错误:你的
GROUP BY仅包含id, name, class,未加入key列,导致key不同的记录(如id=2的两条)被错误归为同一组,完全重复的记录也无法正确去重。 - 不必要的过滤与字段:
having count(*) > 1是筛选分组后数量大于1的组,但你的需求是保留所有唯一行(无论重复次数),该条件会错误过滤掉仅出现一次的行;同时count(*)并非你需要返回的字段。
内容的提问来源于stack exchange,提问作者Joe Swift
相关产品推荐
相关产品推荐

