Oracle
 sql >> Database >  >> RDS >> Oracle

Scrivi una query per trovare il nome dello studente o degli studenti che hanno ottenuto il punteggio massimo in Ingegneria del software. Ordina il risultato in base al nome

Oltre al fatto che stai utilizzando una sintassi della virgola implicita obsoleta per i join, stai anche combinando le colonne delle tabelle in modo errato nella sottoquery.

subject_name è una colonna di subject che non ha nulla a che fare con il rapporto dello studente con i voti. Quindi, il voto può essere unito separatamente con il soggetto mentre si determina lo student_id con il punteggio più alto. Possiamo quindi ottenere il nome dello studente utilizzando quegli student_id

Quindi, in Oracle 12c e versioni successive, potresti farlo

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;  

Per le versioni precedenti, puoi utilizzare 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;