You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:09:03