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 :
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 = maxIdB
mais le me fait une QuerySyntaxException il ne veut pas de () direct.

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