左连接多表获取唯一行异常:返回行数不符预期排查
问题描述
需要关联两张表实现以下需求:
样例表结构与数据
TableA(含唯一ID列)
ID Name Department 1 John IT 2 Jason Sales 3 Dany IT 4 Mike HR 5 Alex HR
TableB(含TableA的ID列)
ID AccountNumber WebID 1 10725 ABC1 1 10726 ABC1 1 10727 ABC1 2 20100 ABC2 2 20101 ABC2 3 30100 ABC3 4 40100 NULL
期望结果
ID Name WebID 1 John ABC1 2 Jason ABC2 3 Dany ABC3 4 Mike NULL 5 Alex NULL
尝试的查询与问题
我用以下查询在样例表中能得到正确结果:
Select count(a.ID), a.ID, a.Name, b.WebID from TableA a left join TableB b on a.ID = b.ID group by a.ID, a.Name, b.WebID
但在实际数据库中,该查询返回30992行,不符合预期:TableA有29066行,左连接应返回29066行。经查询,TableA中有6033行的ID不存在于TableB中:
Select * from TableA where ID not in (Select ID from TableB)
请问我的查询存在什么问题?
问题分析与解决方案
问题根源
你的查询错误在于GROUP BY a.ID, a.Name, b.WebID的分组逻辑:当同一个a.ID在TableB中对应不同的WebID值时,会被拆分成多个分组,导致最终结果行数超过TableA的总行数。
举个例子,如果某ID在TableB中有两条记录,WebID分别为XYZ1和XYZ2,那么分组后会生成两行对应同一个ID,这就额外增加了结果行数,最终导致总记录数达到30992行,而非预期的29066行。另外,查询中的count(a.ID)属于冗余字段,你的需求并不需要计数。
正确的查询写法
写法一:先聚合TableB再左连接(推荐)
先对TableB按ID分组,确保每个ID只返回一个WebID(同一ID的WebID理论上应一致,用MAX/MIN均可),再和TableA左连接:
SELECT a.ID, a.Name, b.WebID FROM TableA a LEFT JOIN ( SELECT ID, MAX(WebID) AS WebID FROM TableB GROUP BY ID ) b ON a.ID = b.ID
写法二:使用DISTINCT去重
直接在左连接后通过DISTINCT去除重复的ID-WebID组合:
SELECT DISTINCT a.ID, a.Name, b.WebID FROM TableA a LEFT JOIN TableB b ON a.ID = b.ID
这两种写法都能保证结果行数和TableA一致,符合你的需求。
内容的提问来源于stack exchange,提问作者DevP
相关产品推荐
相关产品推荐

