如何查询employees表中指定日期未在emp_attend表出现的员工数据
解决指定日期未出勤员工的查询问题
我来帮你搞定这个查询问题~你原来的语句之所以会返回所有员工,是因为OR emp_attend.date != ?这个条件出了问题:当员工在其他日期有出勤记录时,这条记录会满足date != 指定日期,从而让整个条件成立,导致这些员工也被筛选出来,这显然不是你想要的结果。
下面给你两种正确的解决方案:
方案一:在LEFT JOIN的关联条件中加入日期筛选
把日期条件放到LEFT JOIN的ON子句里,这样只会关联员工指定日期的出勤记录,之后再筛选出关联不上的员工(也就是该日期没有出勤记录的员工):
String selectQuery = "SELECT \n" + "employees.emp_id, employees.first_name, employees.last_name \n" + "FROM employees \n" + "LEFT JOIN emp_attend ON emp_attend.emp_id = employees.emp_id AND emp_attend.date = ? \n" + "WHERE emp_attend.emp_id IS NULL";
方案二:使用NOT EXISTS子查询(逻辑更清晰)
直接判断员工在指定日期不存在出勤记录,这种方式的可读性更强,性能也很稳定:
String selectQuery = "SELECT \n" + "employees.emp_id, employees.first_name, employees.last_name \n" + "FROM employees \n" + "WHERE NOT EXISTS ( \n" + " SELECT 1 FROM emp_attend \n" + " WHERE emp_attend.emp_id = employees.emp_id AND emp_attend.date = ? \n" + ")";
这两种方法都能准确筛选出:要么从来没有在emp_attend表登记过,要么指定日期没有登记出勤的员工。
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

