Terlepas dari kenyataan bahwa Anda menggunakan sintaks koma implisit yang sudah ketinggalan zaman untuk bergabung, Anda juga menggabungkan kolom tabel dengan cara yang salah di sub kueri.
subject_name
adalah kolom subject
yang tidak ada hubungannya dengan hubungan siswa dengan nilai. Jadi, nilai dapat digabungkan secara terpisah dengan mata pelajaran sambil menentukan id_siswa dengan nilai tertinggi. Kami kemudian dapat memperoleh nama siswa menggunakan student_id tersebut
Jadi, Di Oracle 12c dan di atasnya, Anda bisa melakukan
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;
Untuk versi sebelumnya, Anda dapat menggunakan dense_rank
atau 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;