結合に古い暗黙のコンマ構文を使用しているという事実とは別に、サブクエリでテーブルの列を間違った方法で結合していることもあります。
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;