sql >> Base de Datos >  >> RDS >> Oracle

Escriba una consulta para encontrar el nombre del alumno(s) que ha obtenido la nota máxima en Ingeniería del Software. Ordenar el resultado según el nombre

Además del hecho de que está utilizando una sintaxis de coma implícita obsoleta para las uniones, también está combinando columnas de las tablas de forma incorrecta en la subconsulta.

subject_name es una columna de subject que no tiene nada que ver con la relación del alumno con las notas. Por lo tanto, la marca se puede unir por separado con el sujeto al determinar los ID_estudiantes con la calificación más alta. Luego podemos obtener el nombre del estudiante usando esos id_estudiantes

Entonces, en Oracle 12c y superior, podrías hacer

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 versiones anteriores, puede usar dense_rank o 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;