Oracle
 sql >> Base de données >  >> RDS >> Oracle

Rédigez une requête pour trouver le nom du ou des étudiants qui ont obtenu la note maximale en génie logiciel. Trier le résultat en fonction du nom

Outre le fait que vous utilisez une syntaxe de virgule implicite obsolète pour les jointures, vous combinez également les colonnes des tables dans le mauvais sens dans la sous-requête.

subject_name est une colonne de subject qui n'a rien à voir avec le rapport de l'élève aux notes. Ainsi, la note peut être jointe séparément au sujet tout en déterminant les student_ids avec la note la plus élevée. Nous pouvons alors obtenir le nom de l'étudiant en utilisant ces student_ids

Donc, dans Oracle 12c et supérieur, vous pourriez faire

SELECT s.student_name
   FROM student s
WHERE s.student_id IN ( SELECT m.student_id
                        FROM mark m JOIN subject su 
                         ON su.subject_id = m.subject_id
                        WHERE lower(su.subject_name) = 'software engineering'
                           ORDER BY m.value DESC
                        FETCH FIRST 1 ROWS WITH TIES ) order by 1;  

Pour les versions précédentes, vous pouvez utiliser dense_rank ou rank

SELECT s.student_name
   FROM student s
WHERE s.student_id IN ( SELECT student_id
                        FROM ( SELECT m.*,DENSE_RANK() OVER(
                                    ORDER BY m.value DESC
                               ) AS rnk
                               FROM mark m  JOIN subject su 
                                ON su.subject_id = m.subject_id
                        WHERE lower(su.subject_name) = 'software engineering'
                    ) WHERE rnk = 1
               ) order by 1;