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

无外键时Student、Course、Teacher三张表如何正确连接?

表连接逻辑与SQL实现方案

核心连接逻辑分析

首先明确三张表的业务关联(忽略表中冗余的Std_Id字段,因为课程/教师不应绑定特定学生):

  • Student表:Std_Id是学生唯一标识,Course_Id是学生所选课程ID,Teacher_Id是学生对应课程的授课教师ID。
  • Course表:Course_Id是课程唯一标识,Teacher_Id记录该课程的官方授课教师ID。
  • Teacher表:Teacher_Id是教师唯一标识,Course_Id记录该教师教授的课程ID。

要查询「有对应课程和教师的学生信息」,需要同时满足三个关联条件:

  1. 学生所选课程真实存在 → Student.Course_Id = Course.Course_Id
  2. 学生所选教师真实存在 → Student.Teacher_Id = Teacher.Teacher_Id
  3. 该教师确实教授学生所选的课程(二选一,根据业务需求):
    • 以教师的授课范围为准:Student.Course_Id = Teacher.Course_Id
    • 以课程的指定教师为准:Course.Teacher_Id = Student.Teacher_Id

具体SQL示例

场景1:以教师的授课范围为准

只保留「学生选的课程在该教师的授课列表中」的记录:

SELECT 
    s.Std_Id,
    s.Std_Name,
    c.Course_Name,
    t.Teacher_Name
FROM Student s
INNER JOIN Course c 
    ON s.Course_Id = c.Course_Id
INNER JOIN Teacher t 
    ON s.Teacher_Id = t.Teacher_Id 
    AND s.Course_Id = t.Course_Id

执行后会筛选出如Ramesh(选C++,由Ben教授,而Ben确实教授C++)这类符合条件的学生。

场景2:以课程的指定教师为准

只保留「学生选的教师与课程官方指定教师一致」的记录:

SELECT 
    s.Std_Id,
    s.Std_Name,
    c.Course_Name,
    t.Teacher_Name
FROM Student s
INNER JOIN Course c 
    ON s.Course_Id = c.Course_Id
INNER JOIN Teacher t 
    ON s.Teacher_Id = t.Teacher_Id 
    AND c.Teacher_Id = s.Teacher_Id

执行后会筛选出如Nilay(选JAVA,由Ben教授,而JAVA的官方教师正是Ben)这类符合条件的学生。


避坑提醒

不要使用表中冗余的Std_Id字段做连接(比如Student.Std_Id = Course.Std_Id),这类字段属于设计缺陷,无法反映真实业务关联,会导致查询结果完全错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:15:39