表结构:
学生表:Student (sNO, sName, mNO, sSex, sBirth, sNative, sHeight, sWeight, sEntime) 其中sNO是学号,mNO是专业号
选课表:Student_Course(sNO, ccNO, NormalMark, ExamMark, Mark) 其中 ccNO是课程编号
课程表:Course_Class(ccNO, cNO, Term, tNO, CourseType, ExamType, Credit, Room, WeekTime, validity) 其中tNO是教师号
查询选修了全部已开课程的学生名。
答案提供了一种解法:
select sNO, sName
from student s
where not exists (
select * from course_class cc
where not exists (
select * from student_course sc
where s.sNO=sc.sNO and sc.ccNO=cc.ccNO
)
)
想了很久想不出上述解的原理,求解释。
还有,有没有别的解法?
------解决方案--------------------
你可以把2的语句里的EXISTS再去掉,像这样:
SELECT *
FROM STUDENT ST
WHERE EXISTS(
--存在这样一个课程
SELECT 1
FROM COURSE_CLASS CC
WHERE EXISTS(
--这个课程既属于这个班级,又属于这个学生
SELECT 1
FROM STUDENT_COURSE SC
WHERE
SC.SNO=ST.SNO
AND SC.CNO=CC.CNO
)
这个逻辑是什么呢:查询选修了至少一门课程的学生。