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

编写查询近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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:37:40