如何在查询有至少1条订单的用户时避免使用DISTINCT或GROUP BY
问题解答
结论
这个场景完全可以避免使用DISTINCT或者GROUP BY,更推荐使用EXISTS半连接的写法实现需求。
你当前使用内连接+DISTINCT的写法需要去重,本质是因为单个用户如果关联到多条订单记录时,JOIN操作会生成多条对应用户的结果行,才需要额外做去重处理。
替代实现方案
SELECT us.* FROM dbo.users us WHERE EXISTS ( SELECT 1 FROM dbo.orders o WHERE o.userId = us.id )
方案优势
EXISTS属于半连接逻辑,数据库在校验每个用户是否符合条件时,只要找到该用户对应的第一条订单记录就会终止匹配,不会生成多余的重复用户行,天然不需要额外去重操作- 性能远优于
DISTINCT/GROUP BY方案:不需要对结果集做排序、去重的聚合计算,尤其是当用户表字段较多、订单表数据量较大时,性能差距会更明显 - 语法更简洁,不需要额外维护去重逻辑、也不需要在
GROUP BY后面罗列所有用户表的查询字段
内容的提问来源于stack exchange,提问作者user16421419
相关产品推荐
相关产品推荐

