如何用SQL从用户表与出勤表中筛选缺勤人员?
解决缺勤人员SQL查询问题
原SQL的问题所在
- 用了
INNER JOIN:这种连接仅返回两张表user_id完全匹配的记录,因此users.user_id不可能为NULL,自然查不到结果。 - 查询起点错误:缺勤人员是不在
user_attendance表中的用户,应该以users表作为主表查询。
正确的缺勤人员查询方法
方法1:LEFT JOIN + 空值筛选
SELECT users.* FROM users LEFT JOIN user_attendance ON users.user_id = user_attendance.user_id WHERE user_attendance.user_id IS NULL;
逻辑:LEFT JOIN会保留users表的所有用户记录,对于未出勤的用户,user_attendance表对应的字段会是NULL,通过筛选这个空值就能得到缺勤人员。
方法2:NOT EXISTS子查询
SELECT users.* FROM users WHERE NOT EXISTS ( SELECT 1 FROM user_attendance WHERE user_attendance.user_id = users.user_id );
逻辑:逐个检查users表的用户,只要该用户未出现在user_attendance表中,就返回这条记录。
出勤人员查询(附)
如果需要查询出勤人员,可用以下两种方式:
-- 方式1:INNER JOIN SELECT DISTINCT users.* FROM users INNER JOIN user_attendance ON users.user_id = user_attendance.user_id;
-- 方式2:EXISTS子查询 SELECT users.* FROM users WHERE EXISTS ( SELECT 1 FROM user_attendance WHERE user_attendance.user_id = users.user_id );
内容的提问来源于stack exchange,提问作者user19814451
相关产品推荐
相关产品推荐

