如何基于键列返回无匹配空值?查询无离职记录的已终止员工
问题需求
我们需要编写SQL查询,找出employee表中已终止雇佣(Term_Flag为Yes)但在Emp_History表中无离职(Term)记录的员工。
表结构说明
Employee表
| Emp_ID | Emp_Name | Term_Flag |
|---|---|---|
| 1 | Sally | No |
| 2 | Lucy | Yes |
| 3 | Marcie | Yes |
Emp_History表
| Emp_ID | Emp_Date | Reason_Code |
|---|---|---|
| 1 | 1/1/2024 | Hire |
| 2 | 1/1/2023 | Hire |
| 2 | 12/31/2024 | Term |
| 3 | 1/1/2025 | Hire |
预期结果:返回Marcie,她的Term_Flag为Yes,但Emp_History中没有对应的Term记录。
解决方案
以下是几种可行的实现方式:
方法1:LEFT JOIN + IS NULL
通过左连接关联员工表和离职记录,筛选出未匹配到Term记录的员工:
SELECT e.Emp_ID, e.Emp_Name FROM Employee e LEFT JOIN Emp_History eh ON e.Emp_ID = eh.Emp_ID AND eh.Reason_Code = 'Term' WHERE e.Term_Flag = 'Yes' AND eh.Emp_ID IS NULL;
方法2:NOT EXISTS
通过子查询判断员工是否存在Term记录,不存在则返回:
SELECT Emp_ID, Emp_Name FROM Employee WHERE Term_Flag = 'Yes' AND NOT EXISTS ( SELECT 1 FROM Emp_History WHERE Emp_ID = Employee.Emp_ID AND Reason_Code = 'Term' );
方法3:NOT IN
注意:如果Emp_History中Emp_ID存在NULL值,NOT IN可能导致结果异常,需谨慎使用:
SELECT Emp_ID, Emp_Name FROM Employee WHERE Term_Flag = 'Yes' AND Emp_ID NOT IN ( SELECT Emp_ID FROM Emp_History WHERE Reason_Code = 'Term' );
内容的提问来源于stack exchange,提问作者Elliott Buchholz
相关产品推荐
相关产品推荐

