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;