Ich habe einen Tisch Student (ID, Name, Abteilung, Alter, Score). Ich möchte den jüngsten Schüler finden, der die höchste Punktzahl (unter den jüngsten Schülern) jeder Abteilung hat. In SQL Server kann ich folgende SQL verwenden.Holen Sie sich die oberste Zeile nach der Bestellung von in Oracle Subquery
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).
jedoch in Oracle, können Sie nicht den Auftrag durch Klausel in Unterabfrage verwenden, und es gibt kein Limit/top wie Keyword. Ich muss die Schüler-Tabelle zweimal mit sich selbst verbinden, um das Ergebnis abzufragen. In Orakel verwende ich folgendes 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, das obige SQL für Oracle zu vereinfachen.
In Oracle, Sie * * den Auftrag durch Klausel in einer Unterabfrage verwenden können. –
Es gibt eine Lösung viel einfacher, ohne analytische Funktionen, siehe die akzeptierte Antwort auf meine Frage: http://stackoverflow.com/questions/38180445/oracle-left-join-very-big-table-and-limit-the-joined -rows-to-one-with-the-large – Dany