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

如何从多表连接语句的查询结果中找出重复记录?

嘿,针对你这个多表连接查询结果找重复记录的需求,我给你分享几个实用的SQL方法,都是日常工作里常用的:

方法1:用GROUP BY + HAVING定位重复的核心字段

如果你只是想知道哪些员工(比如以ID作为唯一标识)在结果里重复出现,以及重复的次数,可以把你的原查询作为子查询,对目标字段分组后筛选计数大于1的记录:

SELECT ID, COUNT(*) AS duplicate_count
FROM (
    SELECT e.* 
    FROM dbo.EMP e 
    JOIN dbo.HREMP a ON a.ID = e.ID 
    JOIN dbo.LOGO c ON c.EMPID = e.id 
    JOIN dbo.LOGOACC d ON d.BADGENO = c.BADGENO AND d.ACCLVID IN (2191, 2292, 2293, 2294, 2295, 2296, 2297)
) AS temp_result
GROUP BY ID
HAVING COUNT(*) > 1;

要是你需要判断整条记录完全重复(所有字段值都一模一样),可以把GROUP BY ID改成GROUP BY *(SQL Server支持这种写法),或者手动列出所有字段。

方法2:用ROW_NUMBER()窗口函数查看所有重复的完整记录

如果想看到重复的具体记录内容(而不只是统计次数),窗口函数是个好选择。它能给每组重复的记录编号,你可以筛选出编号大于1的条目:

SELECT *
FROM (
    SELECT 
        e.*,
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT NULL)) AS row_num
        -- 要是判断整条记录重复,把PARTITION BY后面换成所有字段,比如PARTITION BY ID, Name, Dept, ...
    FROM dbo.EMP e 
    JOIN dbo.HREMP a ON a.ID = e.ID 
    JOIN dbo.LOGO c ON c.EMPID = e.id 
    JOIN dbo.LOGOACC d ON d.BADGENO = c.BADGENO AND d.ACCLVID IN (2191, 2292, 2293, 2294, 2295, 2296, 2297)
) AS temp_result
WHERE row_num > 1;

这里PARTITION BY ID是按员工ID分组,你可以根据实际需要调整分组字段。ORDER BY (SELECT NULL)是因为ROW_NUMBER必须指定排序规则,这里不需要特定顺序,用这个写法就能快速跳过排序步骤。

另外提一句:你的查询出现重复,大概率是因为关联的LOGO或LOGOACC表中存在多条匹配同一位员工的记录,比如一个员工对应多个工牌记录,或者多个符合ACCLVID条件的权限记录,导致主表EMP的同一条数据被多次关联返回。

内容的提问来源于stack exchange,提问作者Bodhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:07