查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名

Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表

要求:

查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名

一般写法:

 select S# from SC where C# in (select C# from SC where S#='1002')
    group by S# having count(*)=(select count(*) from SC where S#='1002');

这种写法属于没有理解SQL运行顺序,SQL先在数据库中运行where语句,然后才对结果进行group

所以假如有一个1001同学,1002选课时1001选课的真子集,上面这种写法则会输出1001,这是不对的。

正确答案:

    select SC1.S# from      (select S# from SC group by S# having count(*)=(select count(*) from SC where S#='1002')) SC1,SC  where SC1.S#=SC.S# and C# in (select C# from SC where S#='1002')

先从数量上删除与1002选课数相同的同学,然后再进行in操作,此种写法是对上面错误写法的改进

 select S# from SC where S# not in(select S# from SC where C#  not in (select C# from SC where S#='1002'))   group by S# having count(*)=(select count(*) from SC where S#='1002');(出自师妹之手)

利用双重否定来求解,这是一种更加方便简洁的写法,该方法才算是完全利用了in的逐一对比精要

 

 

作者: 风云

出处: http://www.cnblogs.com/fengyunlishi/

本文版权归风云和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

 

posted @ 2012-10-18 20:03  风云@历史  阅读(7740)  评论(7编辑  收藏  举报