Lesen Sie die oberste Zeile nach der Bestellung in Oracle Subquery

Ich habe einen Tischschüler (ID, Name, Abteilung, Alter, Punktzahl). Ich möchte den jüngsten Studenten finden, der die höchste Punktzahl (unter den jüngsten Studenten) jeder Abteilung hat. In SQL Server kann ich folgendes SQL verwenden.

select * from student s1 
where s1.id in 
(select s2.id from student s2 
where s2.department = s1.department order by age asc, score desc top 1).

In Oracle können Sie die order by-Klausel jedoch nicht in Unterabfragen verwenden, und es gibt kein limit / top-ähnliches Schlüsselwort. Ich muss mich zweimal mit mir selbst an den Schülertisch setzen, um das Ergebnis abzufragen. In Oracle verwende ich folgende SQL.

select s1.* from student s1, 
(select s2.department, s2.age, max(s2.score) as max_score from student s2, 
(select s3.department, min(s3.age) as min_age from student s3 group by s3.department) tmp1 where 
s2.department = tmp1.department and s2.age = tmp1.min_age group by s2.department, s2.age) tmp2 
where s1.department =tmp2.department and s1.age = tmp2.age and s1.score=tmp2.max_score

Hat jemand eine Idee, die obige SQL für Oracle zu vereinfachen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage