SQL关联查询:如何返回含未打卡员工的完整员工列表?
问题分析
你的SQL只能返回已打卡员工的核心原因是:WHERE子句中的ct.clockdate条件过滤掉了无打卡记录的员工。LEFT JOIN后,无匹配打卡记录的员工对应的ct字段全为NULL,而NULL与任何值比较的结果都不成立,导致这部分员工被排除在外。
正确SQL实现
将ct.clockdate的筛选条件从WHERE子句移至LEFT JOIN的ON关联条件中,这样只会关联指定日期的打卡记录,无匹配记录的员工对应字段会保留NULL(即未打卡状态):
SELECT emp.empref ,emp.surname ,emp.forenames ,j.jobpostname ,ct.inactual FROM empdetails emp INNER JOIN jobposts j ON emp.jobpostref = j.jobpostref LEFT JOIN clockingtimes ct ON emp.empref = ct.empref AND ct.clockdate = '2023-05-02 00:00:00.000' -- 将日期条件移至JOIN关联条件 WHERE emp.deptref = 4
补充优化建议
- 若存在员工未关联任何职位(
jobpostref为NULL)且需要保留这类员工,可将INNER JOIN jobposts改为LEFT JOIN jobposts - 若希望未打卡员工的
inactual字段显示为空字符串而非NULL,可使用COALESCE(ct.inactual, '')替换原语句中的ct.inactual
内容的提问来源于stack exchange,提问作者EternalPrimate
相关产品推荐
相关产品推荐

