SQL Server中获取去重记录的正确方法:Distinct与Group By详解
在SQL Server查询中,很多开发者会遇到“按某一列去重并返回对应行完整数据”的需求。常见的误区是直接在SELECT中使用DISTINCT关键字,但这仅能对指定列的整体组合进行去重。本文将解析常见误区,并提供正确的去重逻辑。
Distinct的基本行为与局限
首先看一张简单的表结构示例:
- 字段1:
id - 字段2:
name
包含以下数据:
- ID=1, Name=a
- ID=2, Name=b
- ID=3, Name=c
- ID=4, Name=c
- ID=5, Name=b
场景一:仅查询不重复的Name
如果只希望看到唯一的名字列表,查询语句如下:
SELECT DISTINCT name FROM table;
结果将返回 a、b、c。这达到了预期效果,但丢失了ID等关联信息。
场景二:查询不重复的记录且包含ID
若直接修改为:SELECT DISTINCT name, id FROM table;,你会发现所有5条数据都被保留了。这是因为DISTINCT的作用对象是所有被选中的字段组合,只要(name, id)的组合不完全相同,就不会被视为重复记录。
场景三:语法错误尝试
部分初学者尝试将DISTINCT放在特定位置,例如:SELECT id, DISTINCT name FROM table;。这将直接引发语法错误。在T-SQL中,DISTINCT必须紧跟在SELECT之后。
正确解决方案:Group By分组
当我们需要“按Name去重”并“获取对应的ID及其他列数据”时,单纯使用DISTINCT是不够的。这里的核心逻辑是分组统计。
操作建议:
可以使用 GROUP BY 子句将数据按照 name 进行归类,从而消除重复的名字。
SELECT id, name, COUNT(DISTINCT name)
FROM table
GROUP BY name;
该语句的执行结果是:
- id=1, name=a, count=1
- id=2, name=b, count=1
- id=3, name=c, count=1
注意:
上述结果中包含了冗余的计数列。在实际使用中,应根据具体业务筛选出需要的列。由于 GROUP BY 具有隐式的去重功能,只需对需要去重的字段进行分组即可达到目的。
语法执行注意事项
在使用 GROUP BY 进行复杂查询时,需严格遵循SQL语法的执行优先级,否则容易报错:
- 放置顺序:
GROUP BY必须位于ORDER BY和LIMIT之前。 - 聚合限制: 在
SELECT列表中出现的非聚合字段(非COUNT/SUM/AVG等),通常都应出现在GROUP BY中(SQL Server的严格模式下尤其如此)。
以上就是SQL Server中Distinct及Group By实现去重的详细内容,更多关于SQL Server数据查询技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













