Помимо того, что вы используете устаревший неявный синтаксис запятой для объединений, вы также неправильно комбинируете столбцы таблиц в подзапросе.
subject_name
- это столбец subject
, который не имеет ничего общего с отношением студента к оценкам.Таким образом, оценка может быть объединена отдельно с предметом при определении максимальных оценок student_ids.Затем мы можем получить имя учащегося, используя эти student_ids
Итак, в Oracle 12c и выше вы можете сделать
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;
Для предыдущих версий вы можете использовать dense_rank
или 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;