2017-05-07 6 views
0

私はDBMSクエリを練習していますが、次の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は関係なくGradeの、行ってきた彼らのGradeSに等しいstudentが行われたことをcoursesの数、およびすべてのcoursesの数と一緒にいること。

usnsnameは、次にようWHERESは、その学生のためcoursesの総数に等しく等しく学生のためGrade値のカウントを生成されたリストから選択されます。

安全にどの2人の学生はsnameに同じ値を持っていないと想定することはできないとして一意studentsを識別するために、私は結果でusnが含まれています。

ご不明な点がございましたら、お気軽にコメントを投稿してください。

関連する問題