编写查询近1年未休任何假期员工的SQL语句(含表结构)
修正查询近1年内未休过任何假期员工的SQL语句
咱们先拆解一下原SQL里的几个关键问题,这些问题导致它没法正确实现需求:
- 误用
INNER JOIN:INNER JOIN只会返回两个表中存在匹配关系的记录,但我们要找的是没有休假记录的员工,这种场景下应该用LEFT JOIN来保留所有员工数据,再筛选无匹配的记录。 - 判断NULL的语法错误:SQL里不能用
= NULL来判断字段为空,必须使用IS NULL。 - 逻辑条件混乱:原语句把员工ID匹配、空值判断和日期条件混在
WHERE里,而且日期条件的位置不对——我们需要先限定近1年的休假记录,再排查哪些员工没有这些记录。
下面给你两种正确的实现方式,你可以根据自己的数据库环境选择:
方式一:LEFT JOIN + 空值筛选
这种写法通过左连接关联员工表和近1年的休假记录,再筛选出没有匹配到休假记录的员工:
SELECT E.FIRSTNAME, E.LASTNAME FROM EMPLOYEE24 E LEFT JOIN LEAVE25 L ON E.EMPLOYEEID = L.EMPLOYEEID AND L.STARTDATE > ADD_MONTHS(SYSDATE, -12) -- 仅关联近1年的休假数据 WHERE L.EMPLOYEEID IS NULL -- 无匹配即代表近1年未休假
方式二:NOT EXISTS子查询
这种写法逻辑更直观:直接检查每个员工是否不存在近1年内的休假记录,不存在的就被选中:
SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE24 E WHERE NOT EXISTS ( SELECT 1 FROM LEAVE25 L WHERE L.EMPLOYEEID = E.EMPLOYEEID AND L.STARTDATE > ADD_MONTHS(SYSDATE, -12) )
这种子查询的方式在多数数据库中性能表现不错,尤其是当EMPLOYEEID字段有索引的时候。
内容的提问来源于stack exchange,提问作者user2147357
相关产品推荐
相关产品推荐

