You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表关联多条件查询问题:筛选办公在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)))

错误原因

嵌套子查询逻辑完全偏离需求:

  1. 最内层子查询实际筛选的是BUS楼内特定位置的授课记录,和“不在BUS楼授课”的条件完全相反
  2. 整个查询最终只保留了办公地点在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、姓名、办公位置ID
  • location(位置表):存储位置ID、教学楼代码
  • course_section(课程段表):存储授课教师ID、授课教学楼代码、授课位置ID

内容的提问来源于stack exchange,提问作者khandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:58:25