使用多条件3表关联的SQL IN语句查询结果过多问题求助
问题原因分析
你当前查询返回行数远超预期的核心原因是FROM stud, sec没有添加两表的关联条件,触发了笛卡尔积:所有符合sec.course_num LIKE 'COSC%'的sec表行,和所有符合stud.stno在成绩为B的学生编号集合中的stud表行做了全量交叉匹配,才会出现远多于实际数据量的返回结果。
符合要求的修正方案(仅使用IN子句,无JOIN)
因为你提到第三张表gr和前两张表都有公共关联域,我们可以通过新增sec表和gr表的IN关联约束,保证学生、课程、成绩三者的对应关系,避免笛卡尔积。
假设gr表中关联sec表的对应字段为course_num(你可以替换为你实际使用的关联字段名),修正后的语句如下:
SELECT stud.sname, stud.class, sec.course_num FROM stud, sec WHERE sec.course_num LIKE 'COSC%' -- 筛选出成绩为B的学生 AND stud.stno IN (SELECT gr.student_number FROM gr WHERE gr.grade = 'B') -- 筛选出上述学生拿到B成绩的对应课程,避免学生和课程乱匹配 AND sec.course_num IN (SELECT gr.course_num FROM gr WHERE gr.grade = 'B' AND gr.student_number = stud.stno);
逻辑说明
修正后两个IN条件共同生效:
- 第一个IN子句限定只查询成绩为B的学生
- 第二个IN子句限定只查询这些学生拿到B成绩的、且前缀为COSC的课程
最终返回的每一行都是一一对应的学生+课程组合,不会出现无意义的交叉匹配结果,返回行数会符合你的预期。
内容的提问来源于stack exchange,提问作者Roderick Davis
相关产品推荐
相关产品推荐

