对于下一个问题,我找不到正确的查询。 (参见图片)
此表在此附表,其中第1天是星期一,第2天是星期二,.. 我必须找出哪个老师在第一个小时的星期一有空,但是由于在当天晚些时候要教书而在学校里。因此,结果可能只会给约翰和苏珊,而不会给马克和汤姆,因为他们那天不必教书。
我尝试了简单查询和嵌套查询,但没有一个给出正确的结果。
select distinct Teacher from Schedule where Day = 1 and Hour <> 1 order by Teacher ASC
select distinct Teacher from Schedule where Day = 1 and NOT Hour = 1 order by Teacher ASC
更复杂的查询没有任何作用。
我在做什么错了?
答案 0 :(得分:3)
在这种特殊情况下,可能可以使用聚合。检查老师一天中的最小小时数是否大于1。
SELECT teacher
FROM schedule
WHERE day = 1
GROUP BY teacher
HAVING min(hour) > 1;
对于任何一天和任何时间,更通用的方法都可以使用条件聚合。仅当老师在一天中指定一个小时时才算。因此,当计数为0时,我们知道他们在给定的时间不教书。
SELECT teacher
FROM schedule
WHERE day = ?
GROUP BY teacher
HAVING count(CASE
WHEN hour = ? THEN
1
END) = 0;
(分别用日期或小时的值替换?
。)
另一种方法是使用NOT EXISTS
和相关的子查询。
SELECT DISTINCT s1.teacher
FROM schedule s1
WHERE s1.day = ?
AND NOT EXISTS (SELECT *
FROM schedule s2
WHERE s2.day = s1.day
AND s2.teacher = s1.teacher
AND s2.hour = ?);
如果您有一张包含所有老师的表格,您还可以将其用作来源,并按{{1}(针对当天)和EXISTS
(针对日期和小时)进行过滤}}。