编写一个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;
答
请尝试以下...
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
选择每个usn
和sname
以及student
已承诺的courses
的计数,其中Grade
等于S
,以及student
已进行的所有courses
的计数,与它们的Grade
无关。
的usn
和sname
然后从如此生成WHERE
Grade
值的那个等于S
等于的courses
总计数为学生学生计数的列表中选择。
我在结果中包含usn
以唯一标识students
,因为无法安全地假定没有两名学生的sname
值相同。
如果您有任何问题或意见,请随时发布相应评论。
如果等级可以为空(它未声明为非空),则需要添加对空值的检查。 – mathguy
@GordonLinoff是否有任何其他方式来写这个SQL作为即时通讯不与案件使用情况? –
你可以但会使事情复杂化。借此机会学习新的东西。检查[** CASE **](http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm)sintaxis –