已知有3个表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G )S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
问:使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
问题如上,网上有参考答案,但不是很理解,请各位帮忙解答!
------解决方案--------------------
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno);
思路大致就是 反过来。。一个学生 选择了所有就跟一个学生没有 一门课程没选择一样的道理。
SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno
这一段 里面 可以理解成 这个学生所选择的所有课程,加上外面一起来就是这个学生 有没有未选择 的课程
假如7门课程,这个学生只选择了6门,说明 COURSE里面还有一门会出来。。
再套上最外面的 NOT EXISTS 就相发于 选择了所有的课程。。
------解决方案--------------------
select sn, sd from
(
select s#,count(c#) part_c#
from test_sc
group by s#
)A,
test_s s
where s.s#=a.s#
and a.part_c#=(select count(1) from test_c)