Além do fato de você estar usando uma sintaxe de vírgula implícita desatualizada para junções, você também está combinando colunas das tabelas de maneira errada na subconsulta.
subject_name
é uma coluna de subject
que nada tem a ver com a relação do aluno com as notas. Portanto, a nota pode ser unida separadamente com o assunto ao determinar os student_ids com a nota mais alta. Podemos então obter o nome do aluno usando esses student_ids Então, no Oracle 12c e acima, você pode fazer
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;
Para versões anteriores, você pode usar
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;