我有两张桌子:
在此表中,我有所有员工:
员工(id_employe,姓名,电话)
在此表中,我有所有在场的员工:
出席(id_present,date,#id_empoye)
现在,我想选择所有缺席的员工(所有不在场的员工)和缺勤日期。
我很抱歉英语不好,我想要一个帮助!
这是我的SQL查询:
select id_employe, date from employe, absence where id_employe not in
(select id_personnel from absence group by date) group by id_employe
order by date asc;
答案 0 :(得分:0)
假设您只想要某一天不在场的员工,您可以使用以下查询:
SELECT e.*
FROM employee e
WHERE NOT EXISTS (
SELECT id_present FROM present WHERE id_employee = e.id_employee AND date = <date>
);
这将为您提供<date>
日期缺席的员工。由于我们只查询一个日期,因此不需要排序。
答案 1 :(得分:0)
您首先要做的是使用子查询为您的所有员工提供每天工作日的记录。我假设如果当天有任何一个人出现在工作中,这是一个工作日。因此,我选择每个不同的工作日期并将其加入每个员工。我说ON 1=1
因为这个条件总是正确的,并且会给我一个每个员工和工作日的记录。
然后,我拿着那个临时表,然后加入Present表。如果员工在工作日出现,他将从Present表中加入记录,因此我只能查找没有加入的记录,即p.id_present IS NULL
。
WITH WorkDateTable AS (
SELECT e.id_employe, p.work_date
FROM Employe e LEFT JOIN (SELECT DISTINCT work_date FROM Present) p ON 1=1)
SELECT wd.id_employe, wd.work_date AS AbsenceDate
FROM WorkDateTable wd
LEFT JOIN Present p ON p.work_date = wd.work_date AND p.id_employe = wd.id_employe
WHERE p.id_present IS NULL
ORDER BY AbsenceDate, wd.id_employe
请注意,date
是保留字,您不能将其用于字段,这就是我将其更改为work_date
的原因。您的最终结果是工作日期列表以及当天缺席的人员ID。
如果您想知道在特定日期或日期范围内谁不在,您只需要在最后的WHERE语句中添加一个子句。
修改强> MySQL不支持使用WITH子句。因此,将WITH语句移动到FROM语句内部,如下所示:
SELECT wd.id_employe, wd.work_date AS AbsenceDate
FROM (SELECT e.id_employe, p.work_date
FROM Employe e LEFT JOIN (SELECT DISTINCT work_date FROM Present) p ON 1=1) wd
LEFT JOIN Present p ON p.work_date = wd.work_date AND p.id_employe = wd.id_employe
WHERE p.id_present IS NULL
ORDER BY AbsenceDate, wd.id_employe
此查询应适用于MySQL或Oracle搜索。