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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:08