如何从多表连接语句的查询结果中找出重复记录?
嘿,针对你这个多表连接查询结果找重复记录的需求,我给你分享几个实用的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
相关产品推荐
相关产品推荐

