J'ai un étudiant de table (identifiant, nom, département, âge, score). Je veux trouver le plus jeune étudiant qui a le score le plus élevé (parmi les élèves les plus jeunes) de chaque département. Dans SQL Server, je peux utiliser SQL suivant.Obtenir la ligne supérieure après la commande dans Oracle Sous-requête
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).
Cependant, dans Oracle, vous ne pouvez pas utiliser la commande par clause et sous-requête il n'y a pas de limite/mot-clé comme supérieure. Je dois rejoindre la table des étudiants avec deux fois pour interroger le résultat. Dans Oracle, j'utilise SQL suivant.
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
Est-ce que quelqu'un a une idée pour simplifier le SQL ci-dessus pour oracle.
Dans Oracle, vous * pouvez * utiliser la commande par clause dans une sous-requête. –
Il existe une solution beaucoup plus simple, sans fonctions analytiques, voir la réponse acceptée à ma question: http://stackoverflow.com/questions/38180445/oracle-left-join-very-big-table-and-limit-the-joined -rows-to-one-with-the-large – Dany