多表关联多条件查询问题:筛选办公在BUS楼但不在此授课的教师
筛选办公在BUS楼但不在BUS楼授课的教师解决方案
需求
列出所有办公地点在Business(BUS)教学楼,但从未在该教学楼授课的教师。
问题描述
单独查询可正确找出3位办公在BUS楼的教师,也能单独筛选出不在BUS楼授课的教师,但组合查询后始终无法得到唯一符合条件的Jerry Williams(f_id 3),最多返回2个结果,甚至直接返回全部3位办公在BUS楼的教师。
现有错误代码
select f_first,f_last from faculty where loc_id in ( select loc_id from location where bldg_code in ( select bldg_code from course_section where (bldg_code = "BUS") and (loc_id <> 5 and loc_id <> 6 and loc_id <> 7 and loc_id <> 8)))
错误原因
嵌套子查询逻辑完全偏离需求:
- 最内层子查询实际筛选的是BUS楼内特定位置的授课记录,和“不在BUS楼授课”的条件完全相反
- 整个查询最终只保留了办公地点在BUS楼的教师,完全没有过滤“是否在BUS楼授课”的条件
正确SQL写法
方案1:NOT EXISTS 子查询(推荐,逻辑清晰)
SELECT f_first, f_last FROM faculty f -- 关联位置表,筛选办公地点在BUS楼的教师 JOIN location l ON f.loc_id = l.loc_id WHERE l.bldg_code = 'BUS' -- 排除所有在BUS楼有授课记录的教师 AND NOT EXISTS ( SELECT 1 FROM course_section cs WHERE cs.f_id = f.f_id AND cs.bldg_code = 'BUS' );
方案2:LEFT JOIN + IS NULL
SELECT DISTINCT f.f_first, f.f_last FROM faculty f JOIN location l ON f.loc_id = l.loc_id -- 左关联BUS楼的授课记录,无匹配则为NULL LEFT JOIN course_section cs ON f.f_id = cs.f_id AND cs.bldg_code = 'BUS' WHERE l.bldg_code = 'BUS' -- 只保留无BUS楼授课记录的教师 AND cs.f_id IS NULL;
数据背景说明
涉及三张表:
faculty(教师表):存储教师ID、姓名、办公位置IDlocation(位置表):存储位置ID、教学楼代码course_section(课程段表):存储授课教师ID、授课教学楼代码、授课位置ID
内容的提问来源于stack exchange,提问作者khandro
相关产品推荐
相关产品推荐

