无外键时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。
要查询「有对应课程和教师的学生信息」,需要同时满足三个关联条件:
- 学生所选课程真实存在 →
Student.Course_Id = Course.Course_Id - 学生所选教师真实存在 →
Student.Teacher_Id = Teacher.Teacher_Id - 该教师确实教授学生所选的课程(二选一,根据业务需求):
- 以教师的授课范围为准:
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
相关产品推荐
相关产品推荐

