我想的是先查找出20125122学生选修的课程,在嵌套进去,再查询那些学生选了他选的课,但20125122学生选的课很多,在查询的时候,别的学生只要满足其中一个课程就会查询出一个结果,而要求是查询出的学生必须也选择20125122所选的全部课程才满足条件,怎么改才能使查询出的学生选的课包含了学生20125122所选的全部课程,不能只满足有一个课程就会出查询结果,不使用答案上给的not exist语句查询
先找出20125122学生选修的所有课程编号,存入临时表。然后选修表与临时表通过课程号关联,查找有共同选修课程的记录,对关联结果使用学号分组统计,过滤出选修课程数与20125122学生选修课程数相同的。
如下SQL,t1为上述临时表,假设该学生选修了 1 2 3 4 课程;t2为模拟所有学生选修课程记录,sid为简化的学生学号,cid为课程号,nm为课程名称,t2中3行分别代表3个学生的选修记录,学生1选修了 1 2 4 课程,学生2选修了 1 2 3 4 课程,学生3选修了 1 2 3 4 5 课程。t1 t2 关联时只会得到与20125122学生有共同选修的记录,选课数相同即表示至少选修了这些课程:
with t1 as (select 1 cid union select 2 union select 3 union select 4),
t2 as (select 1 sid, 1 cid, 'aa' nm union select 1, 2 , 'bb' union select 1, 4 sid, 'dd'
union select 2, 1, 'aa' union select 2, 2, 'bb' union select 2, 3, 'cc' union select 2, 4, 'dd'
union select 3, 1, 'aa' union select 3, 2, 'bb' union select 3, 3, 'cc' union select 3, 4, 'dd' union select 3, 5, 'ee'
)
select t2.sid from t1, t2
where t1.cid=t2.cid
group by t2.sid having count(*)=(select count(*) from t1)
查询结果为:2 3 两条记录,表示 2 3 两个学生。