如何用SQL查询全部在职员工并展示其指定表单的签署状态?
调整查询以显示所有符合条件的在职员工及签署状态
问题出在你把tblSign的过滤条件放在了WHERE子句里,导致LEFT JOIN退化成了INNER JOIN——未签署符合条件表单的员工对应的tblSign字段值为NULL,WHERE里的条件会把这些行直接过滤掉。
要实现显示所有estatus='A'且location='013'的在职员工,同时展示他们是否签署了指定表单,需要把tblSign的筛选条件移到LEFT JOIN的ON子句中,而不是WHERE子句。另外关联tblLocs获取位置信息的逻辑可以保留,示例语句如下:
SELECT e.emplid, e.full_name, -- 替换为实际员工姓名字段 e.location, l.location_name, -- 替换为tblLocs中实际的位置名称字段 s.sigdate, s.sigact, -- 新增字段直观显示签署状态 CASE WHEN s.emplid IS NOT NULL THEN '已签署符合条件的表单' ELSE '未签署' END AS sign_status FROM tblEmpl e -- 关联tblLocs获取位置信息,若tblLocs中一定存在对应location的记录,用INNER JOIN更高效 INNER JOIN tblLocs l ON e.location = l.location_code -- 替换为实际关联字段 LEFT JOIN tblSign s ON e.emplid = s.emplid -- 替换为员工表和签署表的实际关联字段 AND s.formid = '9648' AND s.sigact <> 'O' AND s.sigdate >= '2022-11-01' WHERE e.estatus = 'A' AND e.location = '013';
关键说明:
- 将
tblSign的筛选条件放在LEFT JOIN的ON子句中,只会在关联时匹配符合条件的签署记录,不会过滤主表tblEmpl中的员工行,未签署的员工对应的tblSign字段会显示为NULL。 - 用
CASE语句可以生成一个直观的签署状态字段,方便快速查看结果。 - 请根据实际表结构替换示例中的字段名(比如关联字段、姓名/位置名称字段)。
内容的提问来源于stack exchange,提问作者TimmyTurn123
相关产品推荐
相关产品推荐

