1

我将员工出勤情况存储在具有以下结构的表“出勤率”上:

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

2 回答 2

1

您可以更改您的机制以每天为每位员工存储数据。是的,它会添加很多行,但是你怎么能确定你会从记录的数据中获取所有日期呢?如果今天没人上班怎么办?没有人会缺席吗?

如果你会去:

EmpID, CDate, Present
1, {date}, 0|1

那么您将获得更简单、更快速的查询来换取表大小:

select CDate from attendance where EmpID = 1 and status = 0;
于 2012-04-18T07:00:44.690 回答
1

问题不在于 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 而不是聚合。

于 2012-04-18T07:01:53.143 回答