自己做到这个部分一直迷惑,网上有很多种解答,我也突然有了思考,暂且记下。
标准答案是图片这样
我们可能最内层它的意义就是某人所选修的全部课程
倒数第二层就是从课程表中选择最里层中(某人选修的所有课程中)所缺失的,如果这个人把所有的课选完了,那么这一层查找为空,反之只要没选完,这一层就会输出没有被这个人选择的课程。
然后看最外层,not exists就是说不存在才输出元祖。不存在什么?不存在上一层中某人没有选的课,也就是某人把课选完了。这才输出这个人的学号。
如果这个人有课没有选,在中间那一层中就会有没有被选的课的信息,那么最外层的not检测到有值,就不输出当前所监测的元组(某个人)的信息。这是一次简单的理解,可能与拿着元组去检测的说法有所不同,但是意义一样。
仅留作自用,如有赐教感谢评论。

解决方案 »

  1.   

    找个SQL能正常运行?第4行是个条件,From 后面可以不跟表或者结果集合,而跟个条件吗?
      

  2.   

    select s.sname from student s where s.sno not in (
    select s1.sno from student s1 cross join course c1
    where s1.sno+c1.cno not in
    (select sc.sno+sc.cno  from sc))select sname from student where student.sno not in
    (select distinct sc1.sno from 
    (select * from student s1 cross join course c1) sc1
    left outer join sc on sc1.sno = sc.sno and sc1.cno = sc.cno
    where sc.sno is null)如果不考虑效率的话,上面两种方法应该能够满足你的要求。
    都是先找出没有选修全部课程的学生的sno,然后用not in排除掉,得到选修所有课程的学生