[SQL] Question sur une requête

Question sur une requête [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-07-2016 à 12:56:21    

Hello les gens !
 
Je fais pas mal de requête SQL en ce moment, et je me suis retrouvé confronter à un problème récurant. En gros ça concerne les requêtes où on voudrait mettre une condition sur une fonction d'agrégation.
J'ai trouvé un exemple similaire pour m'expliquer:
 
On veut faire une requête qui renvoie pour chaque université, le nom de l'université et le nom du dernier étudiant inscrit.
 
On a : Table University
bigint id
string name
 
Table Student
bigint id
bigint UniversityId
date registrationDate
string name
 
Bon perso je résoudrais le problème comme ça :
 
SELECT univ.name, stud.name FROM University univ
 INNER JOIN Student stud ON stud.universityId = univ.id
 INNER JOIN (SELECT univ.id AS univId, MAX(stud.registrationDate) AS maxDate FROM University univ
   INNER JOIN Student stud ON stud.universityId = university.id
          GROUP BY univ.id) subRequest ON subRequest.univId = univ.id AND subRequest.maxDate = stud.registrationDate
 
Mais je me demande si il n'y a pas de façon.. plus élégante de faire la requête, vu que avec cette solution on doit faire 2 requêtes à chaque fois, et que c'est pas très fun à décoder.
A noter que la solution doit être compatible avec toutes les SGBD communes (donc pas d'utilisation de fonction spécifique à certaines)
Merci d'avance et @+

Reply

Marsh Posté le 07-07-2016 à 12:56:21   

Reply

Marsh Posté le 07-07-2016 à 15:05:40    

Utiliser FIRST() / LAST() !?
 

Code :
  1. SELECT univ.name, FIRST(stud.name)
  2. FROM university univ
  3. INNER JOIN (
  4. SELECT name FROM student ORDER BY registrationDate DESC) stud ON univ.id = stud.universityId
  5. GROUP BY univ.id


 
NB : je n'ai pas de serveur sous le coude, pas moyen de tester, donc je ne sais pas du tout ce que je raconte :o


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed