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 就相发于 选择了所有的课程。。
目前对 exists和 not exists 掌握得还不行,参考答案是用right join来解决的,不过答案本身有误,经过修正已搞定!多谢大侠指点!要继续学习exists!另附上自己修正过的答案: SELECT SN,SD FROM S WHERE [S#] IN (SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] GROUP BY [S#] HAVING COUNT(*)=SELECT COUNT(C.[C#]) FROM C)
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)
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 S
WHERE [S#] IN
(SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#]
GROUP BY [S#]
HAVING COUNT(*)=SELECT COUNT(C.[C#]) FROM C)
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)