Kromě toho, že pro spojení používáte zastaralou implicitní syntaxi čárek, také nesprávným způsobem kombinujete sloupce tabulek v dílčím dotazu.
subject_name
je sloupec subject
což nemá nic společného se vztahem žáka ke známkám. Známku lze tedy spojit odděleně s předmětem a zároveň určit student_id s nejvyšší známkou. Poté můžeme získat jméno studenta pomocí těchto student_id
Takže v Oracle 12c a vyšším byste mohli udělat
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;
Pro předchozí verze můžete použít dense_rank
nebo 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;