Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Schreiben Sie eine Abfrage, um die Namen der Studenten zu finden, die in Software Engineering die Höchstpunktzahl erreicht haben. Sortieren Sie das Ergebnis nach Namen

Abgesehen davon, dass Sie für Joins eine veraltete implizite Komma-Syntax verwenden, kombinieren Sie in der Unterabfrage auch Spalten der Tabellen falsch.

subject_name ist eine Spalte von subject was nichts mit dem Notenbezug des Schülers zu tun hat. So kann die Note separat mit dem Fach verbunden werden, während die student_ids mit der höchsten Note ermittelt werden. Mit diesen student_ids können wir dann den Namen des Schülers abrufen

In Oracle 12c und höher könnten Sie dies also tun

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;  

Für frühere Versionen können Sie dense_rank verwenden oder 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;