在没定义任何课程的情况下选择学生列表呀,这不是个有用的SQL吧

解决方案 »

  1.   

    经典!SELECT * FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#
    如果S表中当前学号S.S#学习了C表中当前课程C.C#, 上面的语句会返回一条记录(应该是S表中当前学号S.S#学习了C表中当前课程C.C#的成绩记录).SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#)
    语句可以看成:
    SELECT * FROM C WHERE NOT EXISTS (S表中当前学号S.S#学习了C表中当前课程C.C#的成绩记录)
    也就是说找出C表中S.S#没有学习的课程.表达式:
    NOT EXISTS (SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#))
    只有在 "C表中没有S.S#没有学习的课程" 时为 "真".这个语句大概是SQL研究的一个示例. 
      

  2.   

    双Not Exist语句,在《SQL-3参考大全》中介绍了这种用法,本人认为不是一个很好的思路----容易把自己绕进去。
      

  3.   

    如果不用双Not Exist语句,还有其他方法实现上述查询吗?望各位高手赐教!!!
      

  4.   

    笨方法:
      select sname 
        from s
       where s# in(select s# 
                     from sc
                    where s# in(select b 
                                  from (select count(1) a,s# b 
                                          from sc group by s#,c#)
                                         where a=(select count(1) from c)));估计速度很慢!
      

  5.   

    此方法只能对数据库设计比较严格的才有用,即表之间有存在性关系
     select sname 
        from s
      where s# in(select s# 
                    from sc
                    where s# in(select b 
                                  from (select count(1) a,s# b 
                                          from sc group by s#,c#)
                                        where a=(select count(distinct(c#) from c)));
      

  6.   

    按SQL-3标准,可以用any 、some这样的关键字来表示,如果你用的DBMS不支持,就只好将就了。
      

  7.   

    按SQL-3标准,可以用All关键字来表示,如果你用的DBMS不支持,就只好将就了。
      

  8.   

    另一种方法:
    SELECT SNAME
    FROM S
    WHERE EXISTS
          (SELECT *  --或任意列
            FROM C left join (select C from SC where SC.S#=S.S#) SC1
              on C.C#=SC1.C#
            WHERE SC1.C# is null
           )
      

  9.   

    大概是这样的意思吧:只有两个条件都成立的时候才查询.
    if NOT EXISTS
             (SELECT *
                FROM SC
                 WHERE SC.S#=S.S#
                   AND SC.C#=C.C#))
    begin
     if NOT EXISTS
          (SELECT *
            FROM C )
       SELECT SNAME
         FROM S
    end
    else 
       SELECT SNAME
         FROM S
           WHERE 1>2