SQL关联双表查询符合条件的用户访问记录避免重复返回问题
问题原因
重复记录是因为tblUserNotify表中同一个用户存在多条Type=7的记录,和tblUserVisit的单条访问记录做关联时会产生笛卡尔积,导致一条访问记录被多次匹配返回。
解决方案
方案1:不需要返回通知表字段(优先选择,性能最优)
仅需要判断用户是否存在符合条件的通知记录时,使用EXISTS子查询即可,不会产生重复记录:
SELECT TOP (1000) [Id], [SiteId], [UserName], [Visited], [Created], [Status] FROM [tblUserVisit] uv WHERE uv.visited = 'lilje' AND uv.siteid = '3' AND uv.status = '0' AND EXISTS ( SELECT 1 FROM tblUserNotify un WHERE un.UserName = uv.Visited AND un.Type = '7' )
方案2:需要返回通知表字段
如果要同时返回tblUserNotify的Type、Value字段,先对通知表做去重/行限制后再关联,避免笛卡尔积:
SELECT uv.Id, uv.SiteId, uv.UserName, uv.Visited, uv.Created, uv.Status, un.Type, un.Value FROM tblUserVisit uv -- 取该用户Type=7的第一条通知,可自定义排序规则取指定记录 OUTER APPLY ( SELECT TOP 1 Type, Value FROM tblUserNotify WHERE UserName = uv.Visited AND Type = '7' -- 示例:按创建时间倒序取最新的一条通知 -- ORDER BY CreateTime DESC ) un WHERE uv.Status = '0' AND uv.SiteId = '3' AND uv.Visited = 'lilje' -- 过滤掉无对应通知的访问记录 AND un.Type IS NOT NULL ORDER BY uv.Id
内容的提问来源于stack exchange,提问作者Øyvind Isaksen
相关产品推荐
相关产品推荐

