查詢和“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/

本文版權歸風雲和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM