SQL Server跨表统计:左连接后无法返回主表全部ID的问题
问题分析与解决方案
你遇到的问题是LEFT JOIN没有返回主表payments的全部3个ID,核心原因是你把关联表Attendence的过滤条件写在了WHERE子句里,这会让LEFT JOIN的效果变成INNER JOIN——因为那些没有匹配到Attendence记录的主表行,其att相关字段都是NULL,无法满足WHERE里的att.adate和att.cid条件,所以被过滤掉了。
修改后的SQL代码
SELECT p.stId, count(att.adate) FROM payments p LEFT JOIN Attendence att ON att.stId = p.stId AND att.adate between '2018/03/01' and '2018/03/30 23:59:59.999' AND att.cid = 10 WHERE p.cyear = 2018 AND p.cmonth = 3 AND p.cId = 10 GROUP BY p.stId
为什么这样改?
- 把
Attendence的过滤条件移到ON子句中,会先对Attendence表进行条件过滤,再和payments做左关联。这样即使某个payments的ID在Attendence中没有匹配的记录,这行主表数据依然会被保留,对应的count(att.adate)会返回0(因为att.adate为NULL,count函数不会统计NULL值)。 - 主表
payments的过滤条件留在WHERE里,确保只筛选出你需要的2018年3月、cid=10的记录。
这样执行后,就能得到主表中全部3个ID的统计结果了,没有匹配出勤记录的ID会显示统计数为0。
内容的提问来源于stack exchange,提问作者RF312
相关产品推荐
相关产品推荐

