Bonjour messieurs dames,

J'ai deux tables

mvt (id_mvt, id_affaire, mt_mvt)
reg (id_reg, id_mvt, id_affaire, mt_reg)

Le but est de récupérer pour une affaire ses montants dans mvt mais aussi les montants dans reg sachant qu'un mouvement peut avoir 0 ou plusieurs reglements

Première idée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
select id_affaire, sum(mt_mvt), sum(mt_reg)
from mvt left outer reg on mvt.id_mvt = reg.id_mvt
                               and mvt.id_affaire = reg.id_affaire
where mvt.id_affaire = :pid
group by id_affaire ;
Sauf que là mes montants dans mvt sont multipliés par le nombre d'enregistrements de reg. => pas bien

Deuxième idée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
select id_affaire, (select sum(mt_mvt) 
                        from mvt
                        where mvt.id_affaire = :pid) mt_mvt,
                       (select sum(mt_reg) 
                        from reg
                        where reg.id_affaire = :pid
                        and exists (select 1 
                                       from mvt 
                                       where mvt.id_mvt = reg.id_mvt)) mt_reg
from dual ;
Là çà fonctionne mais on remarque qu'on passe deux fois sur la table mvt (c'est uen table à 20 millions d'enreg et reg à 100 millions). => requete un peu lente

Ma question : existe-t-il une méthode pour faire une sorte de "rupture" sur mvt.id_affaire du genre sum(mt_mvt distinct id_affaire)

Merci d'avance.