Ho uno studente da tavolo (id, nome, dipartimento, età, punteggio). Voglio trovare lo studente più giovane che ha il punteggio più alto (tra i più giovani) di ciascun dipartimento. In SQL Server, posso usare il seguente SQL.Ottieni la riga superiore dopo l'ordine 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).
Tuttavia, in Oracle, non è possibile utilizzare la clausola ORDER BY in subquery e non v'è alcun limite/superiore come parola chiave. Devo unirmi al tavolo dello studente con se stesso due volte per interrogare il risultato. In Oracle, io uso il seguente 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
Qualcuno ha qualche idea per semplificare il suddetto SQL per Oracle.
In Oracle, è possibile * * utilizzare la clausola ORDER BY in una subquery. –
C'è una soluzione molto più semplice, senza funzioni analitiche, vedere la risposta accettata alla mia domanda: http://stackoverflow.com/questions/38180445/oracle-left-join-very-big-table-and-limit-the-joined -rows-to-one-with-the-large – Dany