Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Escreva uma consulta para encontrar o nome do(s) aluno(s) que obteve a nota máxima em Engenharia de Software. Classifique o resultado com base no nome


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;