Bonjour à tous,
Pour optimiser mes requêtes, je cherche à utiliser les capacités de du SGDB au lieu de faire tourner du java sur de multiples requêtes.
Mon problème est le suivant : j'ai 3 tables
- tableA : idA | zone
- tableB : idB | idA | idC | stade
- tableC : idC | dateDebut | dateFin
le but est d'obtenir le résultat suivant :
zoneX | stadeY | count(idA de stade Y pour zone X)
zoneX | stadeZ | count(idA de stade Z pour zone X)
zoneY | stadeY | count(idA de stade Y pour zone Y)
...
Ca parait simple mais j'ai n lignes de B pour chaque A et il me faut prendre le stade dans la ligne de B ayant le plus grand idB.
Il faut également ne récupérer que les lignes dont les dates se situent par rapport à une demande de période telle que (dateSortie is null or dateSortie >= debut) and dateEntree <= fin)
Je part donc sur un
select A.idA, A.zone, B.stade from tableA as A left join A.tableB as B left join B.tableC as C where (dateSortie is null or dateSortie >= debut) and dateEntree <= fin)
mais là j'ai toutes mes lignes de B
J'ai donc tenté des fenêtrages :
mais le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select A.idA, A.zone, B.stade from (select A.idA,A.zone,B.idB,B.stade,MAX(idB) over (partition by idA) as maxIdB from tableA as A left join A.tableB as B left join B.tableC as C where (C.dateSortie is null or C.dateSortie >= :debut) and dateEntree <= :fin)) where B.idB = maxIdBme fait une QuerySyntaxException il ne veut pas de () direct.
Code : Sélectionner tout - Visualiser dans une fenêtre à part from ()
En ce moment je ne m'occupe pas encore des dates et je suis obligé de récupérer dans une liste Java mon résultat sur A puis de boucler dessus pour faire une requête sur B à chaque ligne, ça bouffe de la ressource !
Merci d'avance pour votre aide
Partager