Ngoài thực tế là bạn đang sử dụng cú pháp dấu phẩy ngầm đã lỗi thời cho các phép nối, bạn cũng đang kết hợp các cột của bảng theo cách sai trong truy vấn phụ.
subject_name
là một cột của subject
không liên quan gì đến mối quan hệ của học sinh với điểm. Vì vậy, đánh dấu có thể được kết hợp riêng với chủ đề trong khi xác định các học sinh có điểm cao nhất. Sau đó, chúng tôi có thể lấy tên của học sinh bằng các student_ids đó
Vì vậy, trong Oracle 12c trở lên, bạn có thể làm
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;
Đối với các phiên bản trước, bạn có thể sử dụng dense_rank
hoặc 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;