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_name | course_no |
|---|---|
| Harpreet | CS110 |
| Harpreet | CS180 |
| Abdul | CS110 |
| Abdul | CS180 |
| Ralph | CS110 |
| Ralph | CS180 |
| Prateek | CS110 |
| Michael | CS110 |
内容的提问来源于stack exchange,提问作者EV20
相关产品推荐
相关产品推荐

