Afgezien van het feit dat je verouderde impliciete kommasyntaxis voor joins gebruikt, combineer je ook kolommen van de tabellen op de verkeerde manier in de subquery.
subject_name
is een kolom van subject
die niets te maken heeft met de relatie van de student met cijfers. Het cijfer kan dus afzonderlijk worden gekoppeld aan het onderwerp bij het bepalen van de student_id's met het hoogste cijfer. We kunnen dan de naam van de student verkrijgen met behulp van die student_ids
Dus in Oracle 12c en hoger zou je kunnen doen
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;
Voor eerdere versies kunt u dense_rank
. gebruiken of 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;