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

Oracle SQL Developer:从未授课讲师查询及多行子查询困惑

解决从未授课讲师的查询问题

嘿,我来帮你搞定这个问题!你遇到的核心问题应该是之前用了内连接(INNER JOIN)——这种连接只会返回同时在讲师表和授课记录表中有匹配数据的讲师,自然就把那些没授过课的“隐形”讲师给漏掉了。下面给你几种靠谱的解决方案,你可以根据自己的表结构选一个用:

方案1:LEFT JOIN + IS NULL(最常用)

假设你的讲师表叫instructors,授课章节表叫course_sections,关联字段是instructor_id,试试这个SQL:

SELECT i.title, i.first_name, i.last_name, i.zip_code
FROM instructors i
LEFT JOIN course_sections cs 
  ON i.instructor_id = cs.instructor_id
WHERE cs.instructor_id IS NULL
ORDER BY i.last_name, i.first_name;

原理:

左连接(LEFT JOIN)会保留instructors表的所有记录,不管有没有对应的授课记录。然后通过WHERE cs.instructor_id IS NULL过滤掉那些有授课记录的讲师,剩下的就是从未教授过课程章节的人,最后按姓氏、名字字母排序。

方案2:NOT EXISTS(逻辑更直观)

如果你觉得左连接的逻辑有点绕,用NOT EXISTS会更直白:

SELECT title, first_name, last_name, zip_code
FROM instructors i
WHERE NOT EXISTS (
    SELECT 1 -- 这里用1就行,不用查具体字段,效率更高
    FROM course_sections cs
    WHERE cs.instructor_id = i.instructor_id
)
ORDER BY last_name, first_name;

原理:

这个查询会逐个检查每个讲师:如果在course_sections表中找不到该讲师的授课记录,就把这个讲师的信息保留下来,完美匹配你的需求。

方案3:NOT IN(注意避坑)

这个方式也能用,但要注意如果course_sections表的instructor_id有NULL值,NOT IN会返回空结果,所以一定要加过滤条件:

SELECT title, first_name, last_name, zip_code
FROM instructors
WHERE instructor_id NOT IN (
    SELECT DISTINCT instructor_id
    FROM course_sections
    WHERE instructor_id IS NOT NULL -- 必须加这个,避免NULL坑
)
ORDER BY last_name, first_name;

小提示:

记得把上面的表名(instructors、course_sections)和字段名(instructor_id、title等)换成你实际数据库里的名称哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:53:10