查询关联不同UserId的重复Email问题求助
解决关联不同UserId的重复Email查询问题
你的问题出在原查询用count(*) over (partition by cd.email)统计的是该Email对应的所有记录数,而非关联的不同UserId数量。所以如果同一个用户(比如UserId=123)多次关联同一个Email,这条Email的cnt也会大于1,导致被错误筛选出来。
修正后的查询方案
可以改用count(distinct u.UserId) over (partition by cd.email)来统计每个Email关联的不同用户数,这样只有当不同用户数>1时,才会被保留:
select UserId, acitveid, email, userstatusid from ( select u.UserId, u.acitveid, cd.email, u.userstatusid, -- 统计每个Email关联的不同UserId数量 count(distinct u.UserId) over (partition by cd.email) as distinct_user_cnt from ContactDetails cd join UserContactDetails ucd on ucd.ContactDetailsId = cd.ContactDetailsId join dbo.[User] u on u.UserId = ucd.UserId ) ua where distinct_user_cnt > 1
另一种思路(先筛选目标Email再关联)
如果你觉得窗口函数里用distinct性能不太好,也可以先找出存在多个不同UserId的Email列表,再关联回原表获取详情:
select u.UserId, u.acitveid, cd.email, u.userstatusid from ContactDetails cd join UserContactDetails ucd on ucd.ContactDetailsId = cd.ContactDetailsId join dbo.[User] u on u.UserId = ucd.UserId where cd.email in ( select cd_inner.email from ContactDetails cd_inner join UserContactDetails ucd_inner on ucd_inner.ContactDetailsId = cd_inner.ContactDetailsId group by cd_inner.email having count(distinct ucd_inner.UserId) > 1 )
这两种方案都能过滤掉同一用户重复关联的Email,只保留那些被不同UserId关联的重复Email记录,符合你期望的结果。
内容的提问来源于stack exchange,提问作者MonkeyKing
相关产品推荐
相关产品推荐

