我将员工考勤存储在具有以下结构的“考勤”表中:

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')

我以前的回答不好。我应该把这一次的选择放在“开”上,而不是放在一个集合上。

10-05 20:08