Oltre al fatto che stai utilizzando una sintassi della virgola implicita obsoleta per i join, stai anche combinando le colonne delle tabelle in modo errato nella sottoquery.
subject_name
è una colonna di subject
che non ha nulla a che fare con il rapporto dello studente con i voti. Quindi, il voto può essere unito separatamente con il soggetto mentre si determina lo student_id con il punteggio più alto. Possiamo quindi ottenere il nome dello studente utilizzando quegli student_id
Quindi, in Oracle 12c e versioni successive, potresti farlo
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;
Per le versioni precedenti, puoi utilizzare dense_rank
o 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;