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;