sql >> Database >  >> RDS >> Oracle

Schrijf een zoekopdracht om de naam te vinden van de student(en) die het maximale cijfer hebben behaald in Software Engineering. Sorteer het resultaat op naam

Afgezien van het feit dat je verouderde impliciete kommasyntaxis voor joins gebruikt, combineer je ook kolommen van de tabellen op de verkeerde manier in de subquery.

subject_name is een kolom van subject die niets te maken heeft met de relatie van de student met cijfers. Het cijfer kan dus afzonderlijk worden gekoppeld aan het onderwerp bij het bepalen van de student_id's met het hoogste cijfer. We kunnen dan de naam van de student verkrijgen met behulp van die student_ids

Dus in Oracle 12c en hoger zou je kunnen doen

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;  

Voor eerdere versies kunt u dense_rank . gebruiken of 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. Toegang tot SQL Server-berichten via ADO.NET

  2. Wat is het type van deze string? a:1:{s:2:nl;}

  3. Waarom moet DISTINCT eerst gaan in MySQL?

  4. Query om het aantal records in elke tabel in een database weer te geven