2017-05-07 43 views
0

我一直在練習DBMS查詢,我堅持使用下面的SQL查詢:編寫一個sql來檢索所有他/她嘗試過的課程中所有S級學生的名字?

編寫一個sql來檢索所有他/她嘗試過的課程中所有S級學生的名字?

以下是我的表和代碼

create table COURSE 
(
    cId int primary key, 
    cName varchar(30), 
    credits int not null 
); 

create table student 
(
    usn int primary key, 
    sname varchar(20), 
    dno int 
); 

create table RESULT 
(
    SUsn int, 
    CCode int, 
    Grade char, 
    primary key(SUsn,CCode) 
); 

代碼:

select S.sname 
from student S inner join result R on S.usn = R.susn 
where grade = 'S' 
group by S.usn,S.sname 
having count(*) in (
        select count(*) from result 
        group by susn 
        ); 

可我知道我要去哪裏錯了嗎?請幫幫我。

回答

0

你實際上是在過度複雜的問題。你正在回答有關在所有課程中獲得「S」的學生的問題。對於這個問題,你只需要看看是否有任何的成績不是「S」:

select S.sname 
from student S inner join 
    result R 
    on S.usn = R.susn 
group by S.usn, S.sname 
having sum(case when grade <> 'S' then 1 else 0 end) = 0; 
+0

如果等級可以爲空(它未聲明爲非空),則需要添加對空值的檢查。 – mathguy

+0

@GordonLinoff是否有任何其他方式來寫這個SQL作爲即時通訊不與案件使用情況? –

+1

你可以但會使事情複雜化。藉此機會學習新的東西。檢查[** CASE **](http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm)sintaxis –

0

請嘗試以下...

SELECT usn, 
     sname 
FROM (SELECT usn AS usn, 
       sName AS sName, 
       SUM(CASE 
         WHEN Grade = 'S' THEN 
          1 
         ELSE 
          0 
        END) AS sCount, 
       COUNT(*) AS totalCount 
     INNER JOIN result on student.usn = result.SUsn 
     FROM student 
     GROUP BY usn 
    ) AS usnCounter 
WHERE usnCounter.sCount = usnCounter.totalCount 
ORDER BY sname; 

這種說法開始通過student選擇每個usnsname以及student已承諾的courses的計數,其中Grade等於S,以及student已進行的所有courses的計數,與它們的Grade無關。

usnsname然後從如此生成WHEREGrade值的那個等於S等於的courses總計數爲學生學生計數的列表中選擇。

我在結果中包含usn以唯一標識students,因爲無法安全地假定沒有兩名學生的sname值相同。

如果您有任何問題或意見,請隨時發佈相應評論。

相關問題