Modification / Optimisation requete
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:
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:
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.
Solution amélioré, sans le group by rollup
Salut,
J'ai trouvé un moyen plus simple et donne le meme le résultat ,pour éviter le group by rollup (qui diminuait la performance).
1- Solution
Code:
1 2 3 4 5 6 7 8 9
|
SELECT T.id_affaire, T.id_mvt, T.mt_mvt, sum(T.mt_reg) mt_reg
FROM
(SELECT mvt.id_affaire, mvt.id_mvt, sum(mt_reg) mt_reg,
sum(mt_mvt) mt_mvt
FROM mvt LEFT OUTER JOIN reg ON mvt.id_mvt = reg.id_mvt
AND mvt.id_affaire = reg.id_affaire
GROUP BY mvt.id_affaire, mvt.id_mvt, reg.id_reg) T
GROUP BY T.id_affaire, T.id_mvt, T.mt_mvt |
2-Solution
Code:
1 2 3 4 5 6 7 8 9 10
|
SELECT
mvt.id_affaire,
mvt.id_mvt,sum(mt_mvt) mt_mvt ,
(SELECT SUM(mt_reg)
FROM REG
WHERE reg.id_affaire = mvt.id_affaire
AND reg.id_mvt = mvt.id_mvt) mt_reg
FROM mvt
GROUP BY mvt.id_affaire, mvt.id_mvt |