2017-09-20 4 views
0

Comment mettre à jour la requête sql ci-dessous contenant des jointures et sous-requête afin que je puisse obtenir les marques de ExamID = 1 et ExamID = 3 également dans le jeu de résultats final?Cette requête affichera les détails des élèves qui ont réussi les examens ExamID 1 et ExamID 3. Je veux aussi montrer la note obtenue à chaque examen. Comment?

SELECT DISTINCT st.StudentID,st.Name 
FROM Students st 
INNER JOIN StudentMarks stm ON st.StudentID=stm.StudentID 
WHERE st.StudentID IN(SELECT stm.StudentID 
         FROM StudentMarks stm 
         INNER JOIN Exam ex ON stm.ExamID=ex.ExamID 
         WHERE stm.Mark>=ex.MinMarkForPass AND stm.ExamID=1 
INTERSECT 
SELECT stm.StudentID 
FROM StudentMarks stm 
INNER JOIN Exam ex ON stm.ExamID=ex.ExamID 
WHERE stm.Mark >= ex.MinMarkForPass AND stm.ExamID=3) 
+0

Voulez-vous les étudiants qui passent *** les deux examens ***? –

+0

Les étudiants qui ont passé les deux examens seront montrés par la requête ci-dessus. Je veux montrer la note de chacun des deux examens. –

Répondre

1

Pas besoin de INTERSECT, vous pouvez le faire:

WITH BothCTE 
(
    SELECT stm.StudentID 
    FROM StudentMarks stm 
    INNER JOIN Exam ex ON stm.ExamID=ex.ExamID 
    WHERE stm.Mark >= ex.MinMarkForPass AND stm.ExamID IN(1, 3) 
    GROUP BY StudentID 
    HAVING(DISTINCT ExamID) >= 2 
) 
SELECT st.StudentID, st.Name, stm.Mark 
FROM Students st 
INNER JOIN StudentMarks stm ON st.StudentID = stm.StudentID 
WHERE st.StudentID IN(SELECT StudentID FROM BothCTE); 

Le CTE vous donnera les étudiants qui ont pris les deux examens, vous pouvez joindre ces résultats avec la table marques pour obtenir la marques des étudiants.