sql >> Databasteknik >  >> RDS >> Oracle

Skriv en fråga för att hitta namnet på den eller de studenter som har fått högsta betyg i Software Engineering. Sortera resultatet baserat på namn

Förutom att du använder föråldrad implicit kommasyntax för joins, kombinerar du också kolumner i tabellerna på fel sätt i underfrågan.

subject_name är en kolumn med subject vilket inte har med elevens relation till betyg att göra. Så, poäng kan sammanfogas separat med ämne medan man bestämmer student_id med högsta betyg. Vi kan sedan få studentens namn med hjälp av dessa student_id

Så i Oracle 12c och högre kan du göra

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;  

För tidigare versioner kan du använda dense_rank eller 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;     


  1. MySQL SUM med samma ID

  2. MYSQL Välj rader där datum är äldre än datetime

  3. Skapa en kolumn för automatisk ökning i SQLite

  4. MySql-minnesmotorn kontrollerar inte uppdatera främmande nyckel?