注册 登录
编程论坛 SQL Server论坛

问一个数据库语言问题,具体原因是我理解不了!

seki1018 发布于 2007-10-31 13:51, 603 次点击
查询这样的学生,,没有一门课程是他不选修的
SQL语句为
select Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno-Student.Sno
AND Con=Course.Cno));
Course是课程表 里面有Cno 课程号Cname课程名 Cpno先行课 等
SC里面有Sno学号 Cno课程号 Grade成绩
student里面有Sno Sname Ssex Sage Sdept.....
我知道查询没有一门课程是他不选修的要用双重否定
但是为什么是这样Student -Course-SC这3个里面呢?
4 回复
#2
purana2007-10-31 13:53

不知说啥.

#3
bygg2007-10-31 13:55
但是为什么是这样Student -Course-SC这3个里面呢?
---------------------
什么意思?
#4
徐强2007-10-31 17:27

很复杂的一个问题,理解的不透彻,
把我的想法给你参考一下,希望有所帮助
--相当于一个嵌套循环
/*
执行查询就相当于游标检索,第一个记录-->第二个记录
for(int i=0;i<s.count;i++)
{
i已经是固定值了,那么最后一个查询就把范围缩小到i为这个固定值的时候了
中间单个的not exists就没必要用循环分析了(最后一个查询的结果表示学生编号为
i的人选择的所有的课程,not exists很明显结果是查询当前没有被i选择的课程,
如果有返回值说明这个人有没选择的科目(记录下他的i值),没有返回值表示他选择了全部,
根据返回的i的集合(i的集合表示没有选择全部科目的学生标号);查询学生中编号不在
(没有选择全部科目的学生编号集合))
--中间的循环没必要分析
for(int j=0;j<c.count;j++)
{

}
}

*/

#5
徐强2007-10-31 17:36
select sname from student where not exists
(select * from course where not exists
(select * from (select * from sc where sno= student.sno) as a where a.cno=course.cno ))
不知道这样写你会不会好理解些
1