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

SQL多表关联查询如何按指定教授筛选并返回去重选课数据

SQL修正方案

原有语句的问题

  • 缺少针对教授姓氏的筛选条件,没有限定查询范围为指定教授的授课
  • 用GROUP BY做纯去重属于非规范用法,当场景存在多教师同课、学生重复选课时,很容易因为关联逻辑漏条件出现结果错误
  • 逗号分隔的隐式连接写法可读性差,关联条件和筛选条件混在WHERE子句中,初学者很容易漏写关联规则

正确实现SQL

用显式JOIN关联表,DISTINCT做结果去重,直接在teach表加教授姓氏筛选即可(teach表已经存储了授课教授的last_name字段,不需要额外关联professors表就能完成姓氏筛选):

SELECT DISTINCT s.student_name, se.course_no
FROM students s
INNER JOIN student_enrollment se 
    ON s.student_no = se.student_no
INNER JOIN teach t 
    ON se.course_no = t.course_no
WHERE t.last_name = 'Wilson';

逻辑说明

  • 关联顺序从学生到选课记录再到授课记录,关联条件独立写在ON子句后,逻辑清晰不易出错
  • DISTINCT会自动对返回的(student_name, course_no)组合去重,同时覆盖两种重复场景:学生重复选同一门课的冗余记录、同一门课多个老师授课导致的关联结果重复
  • 如果你需要校验teach表中的教授姓氏确实存在于professors表(规避脏数据),可以加EXISTS条件,写法如下:
SELECT DISTINCT s.student_name, se.course_no
FROM students s
INNER JOIN student_enrollment se 
    ON s.student_no = se.student_no
INNER JOIN teach t 
    ON se.course_no = t.course_no
WHERE t.last_name = 'Wilson'
AND EXISTS (
    SELECT 1 FROM professors p 
    WHERE p.last_name = t.last_name
);

基于提供的测试数据,返回结果如下

student_namecourse_no
HarpreetCS110
HarpreetCS180
AbdulCS110
AbdulCS180
RalphCS110
RalphCS180
PrateekCS110
MichaelCS110

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:36:47