mysql - SQL 查询优化 - 移除 Not In 运算符

标签 mysql sql

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

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/

相关文章:

php - mysql查询一个随机?

mysql - 使用Parent ID获取所有子节点

c# - 获取 Entity Framework 中最近插入的行的ID

sql - 如何在 Oracle 的过程中创建表?

mysql - 我不明白那些 '' 字段在数据库结构中的含义,它的目的是什么

php - 在 MySQL 数据库中存储拼音字符的最佳实践是什么?

php - 在 laravel 中检查这个吗?

sql - 设置 SQL 查询格式以不同方式显示

非企业服务器上的 SQL 分区?

sql - 如何在 Excel 表上运行 SQL 查询?