求助编写无聚合函数的嵌套SQL查询以找出教授过所有科目的教员
符合要求的SQL实现方案
使用双重NOT EXISTS嵌套查询实现,完全不涉及任何聚合函数,逻辑为不存在任何一门课程,是当前教员没有教过的,刚好匹配你要的「教授过所有科目」的需求:
SELECT DISTINCT f.* FROM Faculty f WHERE NOT EXISTS ( -- 筛选出当前教员没有授课记录的所有课程 SELECT c.cid FROM Course c WHERE NOT EXISTS ( -- 校验当前教员是否教过对应课程 SELECT 1 FROM Teaches t WHERE t.fid = f.fid AND t.cid = c.cid ) );
逻辑说明
- 外层遍历Faculty表的每一位教员
- 第一层嵌套子查询遍历Course表的所有课程,筛选出该教员没有对应授课记录的课程
- 当第一层子查询没有返回任何结果时(即
NOT EXISTS判断为真),说明该教员不存在未教过的课程,符合筛选条件 - 语句里的
DISTINCT用于避免重复输出同一位教员的信息,如果你需要关联输出对应的授课、课程明细,可以去掉DISTINCT后自行关联Teaches、Course表即可。
和原有方案的对比
你之前用count(*)=4的方案依赖课程总数固定为4的硬编码,本方案无需绑定课程总数,后续课程数量变化也不需要调整SQL,通用性更强。
内容的提问来源于stack exchange,提问作者Harsh Naik
相关产品推荐
相关产品推荐

