У меня есть ученик за столом (имя, фамилия, отдел, возраст, оценка). Я хочу найти самого молодого студента, который имеет самый высокий (среди самых молодых студентов) балл на каждом факультете. В SQL Server я могу использовать следующий SQL.
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).
Однако в Oracle вы не можете использовать предложение order by в подзапросе, и здесь нет ключевого слова limit / top like. Я должен соединить таблицу учеников с собой два раза, чтобы запросить результат. В оракуле я использую следующий 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
Кто-нибудь задумывается упростить приведенный выше SQL для оракула?