编写一个sql来检索所有他/她尝试过的课程中所有S级学生的名字?

编写一个sql来检索所有他/她尝试过的课程中所有S级学生的名字?

问题描述:

我一直在练习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 
        ); 

可我知道我要去哪里错了吗?请帮帮我。

你实际上是在过度复杂的问题。你正在回答有关在所有课程中获得“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 –

请尝试以下...

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值相同。

如果您有任何问题或意见,请随时发布相应评论。