我将员工出勤存储在具有以下结构的“出勤”表中:
EmpID, CDate
考勤系统每天插入此表,其中包含当天所有在场员工的员工 ID。
我需要找出特定员工的缺席陈述。我可以通过选择不在 - 员工在场的日期内的所有不同日期来轻松地做到这一点。
有什么方法可以删除该 sql 语句中的 not in 运算符。请帮忙
这是 EmpId 为 01 的员工的 sql 查询:
select distinct CDate
from attendance
where CDate not in (
Select CDate from attendance where EmpID='01')
最佳答案
问题不在 NOT IN 子句中,而是在子查询中。
你想要更像是:
SELECT DISTINCT a1.CDate, if (EmpID=NULL, false,true) as Present
FROM attendance as a1
LEFT JOIN attendance as a2 USING (CDate)
WHERE a2.EmpID='01'
这是一个笛卡尔连接,它提取所有日期,然后连接员工出勤状态。应该比您的子查询快得多。
已更新,带有经过测试的代码:
SELECT DISTINCT a1.CDate, IF (a2.EmpID IS NULL, false,true) as Present
FROM attendance AS a1
LEFT JOIN attendance AS a2 ON (a1.CDate = a2.CDate AND a2.EmpID='01')
我对之前的回答不好。我应该将子选择放入 ON 而不是聚合。
关于mysql - SQL 查询优化 - 移除 Not In 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10203979/