2017-05-07 4 views
0

Ich habe DBMS-Abfragen praktiziert und ich bin mit der folgenden SQL-Abfrage stecken:Schreiben Sie eine SQL, um Namen aller Schüler mit S-Note in allen Kursen abzurufen, die er/sie versucht hat?

Schreiben Sie eine SQL, um Namen aller Schüler mit S-Klasse in allen Kursen, die er/sie versucht hat, abzurufen?

Im Folgenden sind meine Tabellen und Code

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) 
); 

Code:

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 
        ); 

Darf ich wissen, wohin ich gehe falsch? Bitte hilf mir.

Antwort

0

Sie sind tatsächlich die Frage zu komplizieren. Sie beantworten die Frage nach Schülern, die in allen Kursen ein "S" bekommen haben. Bei dieser Frage müssen Sie nur sehen, ob irgendwelche Typen nicht „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

Wenn die Klasse nullfähig ist (sie ist nicht nicht null deklariert), muss eine Überprüfung auf null hinzugefügt werden. – mathguy

+0

@GordonLinoff Gibt es eine andere Möglichkeit, diese sql zu schreiben, da es nicht mit der Fallverwendung vergleichbar ist? –

+1

Sie können, aber wird die Dinge komplizieren. Nutzen Sie diese Gelegenheit, um etwas Neues zu lernen. Überprüfen Sie die [** CASE **] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm) sintaxis –

0

Bitte versuchen Sie folgendes ...

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; 

Diese Aussage beginnt, indem jeder usn und sname von student Auswahl zusammen mit einer Zählung von courses, die eine student vorgenommen hat, wo ihre GradeS entspricht, und eine Zählung aller courses, die eine student vorgenommen hat, unabhängig von ihrer Grade.

Die usnsname und wird dann aus der Liste ausgewählt, so WHERE die Zählung der Grade Werte für einen Studenten, der erzeugt S die Gesamtzahl der für diesen Schüler courses equal equal.

Ich habe usn in den Ergebnissen enthalten, um eindeutig zu identifizieren, da nicht sicher angenommen werden kann, dass keine zwei Schüler den gleichen Wert für sname haben.

Wenn Sie irgendwelche Fragen oder Kommentare haben, dann zögern Sie nicht, einen Kommentar entsprechend zu posten.

Verwandte Themen