Optimisation requetes imbriquées

Optimisation requetes imbriquées - SQL/NoSQL - Programmation

Marsh Posté le 15-03-2007 à 15:53:01    

Bonjour,
 
 :hello:  
 
J'ai un probleme d'optimisation sur une requete imbriquée.
 
Tout d'abord, ce que je veux ce sont les nouveaux adhérents, c'est à dire ceux qui n'etaient pas presents dans la table Cotis en 2005, ni en 2006, mais qui sont presents en 2007 et qui ont deja regle qq chose en 2007.
 
Voici ma requete :

Code :
  1. SELECT count(Cotis.num) as var FROM Cotis WHERE Cotis.num not in
  2. (SELECT Cotis.num from Cotis where Cotis.annee = " & Year(date) - 2 & " ) and Cotis.num not in
  3. (SELECT Cotis.num from Cotis where Cotis.annee = " & Year(date) - 1 & " ) and Cotis.num in
  4. (SELECT Cotis.num from Cotis where Cotis.annee = " & Year(date) & " and Cotis.[montant regle]>0)


 
Ca fait comme si la requete tournait en boucle, elle met du temps, et me sort bien le resultat au bout de 15 ou 20 minutes...
 [:mareek]  
 
Du coup, comment optimiser ça pour que ça soit plus rapide ?
(Ma table Cotis contient 70.000 enregistrements...)
 [:airforceone]  
 
Merci...


---------------
Le Saoumfa
Reply

Marsh Posté le 15-03-2007 à 15:53:01   

Reply

Marsh Posté le 15-03-2007 à 16:09:07    

Code :
  1. SELECT count(Cotis.num) as var FROM Cotis
  2. WHERE Cotis.annee = " & Year(date) & "
  3. and Cotis.[montant regle]>0)


 
c'est pas plus simple comme ça ?


Message édité par ajnag le 15-03-2007 à 16:12:07
Reply

Marsh Posté le 15-03-2007 à 16:19:05    

bah non, parceque là tu prends toutes les cotisations de l'année 2007, sans différencier les anciens abonnés des nouveaux.
 
Par contre :
 
select count(*) as var
from cotis c1
where c1.annee = ANNEE
and c1.montant_regle > 0
and not exists (select null form cotis c2 where c2.annee < c1.annee and c2.num = c1.num)
 
Déjà ça évite de faire X sous-requêtes.
 
Autre solution (mais il y a une légère différence, puisqu'un ancien abonné qui n'a rien payé l'année précédente est considéré comme nouveau, je ne sais pas si c'est possible et désiré)
 
select count(*)
from (
  select num, min(annee) annee
  from cotis
  where montant_regle > 0
  group by num
)
where annee = ANNEE

Reply

Marsh Posté le 15-03-2007 à 16:24:00    

ah oui, effectivement ;)
 

Reply

Marsh Posté le 15-03-2007 à 16:49:00    

Merci bcp MagicBuzzz, ca marche nickel !
Et pis merci HFR, ca marche mieux que des forums spécialisés Access...
 :love:


---------------
Le Saoumfa
Reply

Sujets relatifs:

Leave a Replay

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