Optimisation de requétes

Optimisation de requétes - SQL/NoSQL - Programmation

Marsh Posté le 31-05-2006 à 12:43:47    

Bonjour à toutes et à tous,
 
Etant novice en SQL, je voudrai savoir s'il est possible d'optimiser ces requêtes :

Code :
  1. SELECT
  2.      SUM(vdp.ENGAGE*(ao.POURCENT/100)) as ENG_TOT, SUM(vdp.FACTURE*(ao.POURCENT/100)) as FACT_TOT
  3. FROM VENT_DIVERS_PROJET vdp
  4.      JOIN APPLI_OBJS ao ON vdp.ID_APPLIPROJET = ao.ID_APPLI
  5.      JOIN BUDGET.COMMANDE_AUTRE ca ON vdp.ID_COMMANDE = ca.NUM_COMMA
  6. WHERE vdp.ANNEE = '2006'
  7.      AND ao.ID_OBJS = '2'
  8.      AND vdp.ID_APPLIPROJET = '3'
  9.      AND vdp.ID_ACTIVITE = '8'
  10.      AND ca.ID_TYPE = '1'


Code :
  1. SELECT
  2.      SUM(vdp.ENGAGE*(ao.POURCENT/100)) as ENG_TOT, SUM(vdp.FACTURE*(ao.POURCENT/100)) as FACT_TOT
  3. FROM VENT_DIVERS_PROJET vdp
  4.      JOIN APPLI_OBJS ao ON vdp.ID_APPLIPROJET = ao.ID_APPLI
  5.      JOIN BUDGET.COMMANDE_AUTRE ca ON vdp.ID_COMMANDE = ca.NUM_COMMA
  6. WHERE vdp.ANNEE = '2006'
  7.      AND ao.ID_OBJS = '2'
  8.      AND vdp.ID_APPLIPROJET = '3'
  9.      AND vdp.ID_ACTIVITE = '8'
  10.      AND ca.ID_TYPE = '2'


Code :
  1. SELECT
  2.      SUM(vdp.ENGAGE*(ao.POURCENT/100)) as ENG_TOT, SUM(vdp.FACTURE*(ao.POURCENT/100)) as FACT_TOT
  3. FROM VENT_DIVERS_PROJET vdp
  4.      JOIN APPLI_OBJS ao ON vdp.ID_APPLIPROJET = ao.ID_APPLI
  5.      JOIN BUDGET.COMMANDE_AUTRE ca ON vdp.ID_COMMANDE = ca.NUM_COMMA
  6. WHERE vdp.ANNEE = '2006'
  7.      AND ao.ID_OBJS = '2'
  8.      AND vdp.ID_APPLIPROJET = '3'
  9.      AND vdp.ID_ACTIVITE = '8'
  10.      AND ca.ID_TYPE = '3'


 
Entre chaque requête, seul le test sur l'ID_TYPE dans la clause where change. N'est-il pas possible de ne faire qu'une seule requête ?
Précision, mon travail s'effectue sur une BDD MySQL 5.0
 
Merci d'avance de vos réponses  :)

Reply

Marsh Posté le 31-05-2006 à 12:43:47   

Reply

Marsh Posté le 31-05-2006 à 13:00:26    

Code :
  1. SELECT
  2.           ca.ID_TYPE,
  3.           SUM(vdp.ENGAGE*(ao.POURCENT/100)) as ENG_TOT, SUM(vdp.FACTURE*(ao.POURCENT/100)) as FACT_TOT
  4. FROM VENT_DIVERS_PROJET vdp
  5.           JOIN APPLI_OBJS ao ON vdp.ID_APPLIPROJET = ao.ID_APPLI
  6.           JOIN BUDGET.COMMANDE_AUTRE ca ON vdp.ID_COMMANDE = ca.NUM_COMMA
  7. WHERE vdp.ANNEE = '2006'
  8. AND ao.ID_OBJS = '2'
  9. AND vdp.ID_APPLIPROJET = '3'
  10. AND vdp.ID_ACTIVITE = '8'
  11. AND ca.ID_TYPE IN ('1', '2', '3')
  12. GROUP BY ca.ID_TYPE;

Reply

Marsh Posté le 31-05-2006 à 13:17:59    

OK, ça marche bien sauf que quand je n'ai pas de résultats pour le type 1 par exemple, il ne me l'affiche pas. Et moi je veux que ma requéte me sorte au final trois ligne (une pour chaque type)

Reply

Marsh Posté le 31-05-2006 à 14:25:14    

Tu as donc des types pour lequels il n'y a pas de ligne dans APPLI_OBJS ou dans COMMANDE_AUTRE ?
 
Dans ce cas il faut faire des LEFT JOIN au lieu de JOIN ...

Reply

Marsh Posté le 31-05-2006 à 15:11:49    

En fait, il ya des types pour lesquels il n'y a pas de ligne dans VENT_DIVERS_PROJET...

Reply

Marsh Posté le 31-05-2006 à 15:27:50    

Dans ce cas il faut réécrire la clause from pour que ce soit VENT_DIVERS_PROJET qui soit en jointure externe.
 
Utilise des RIGHT JOIN au lieu des JOIN pour voir ...

Reply

Marsh Posté le 31-05-2006 à 15:36:55    

ça ne change rien avec les RIGHT JOIN. En fait tous les types sont listés dans une table TYPE_COMMANDE... mais je ne vois pas comment faire ;-(

Reply

Marsh Posté le 31-05-2006 à 15:41:20    

Alors il faut que ta table TYPE_COMMANDE soit la principale de la requête.
 
Enfin c'est pas évident à voir sans le schéma complet des tables impactées ...

Reply

Sujets relatifs:

Leave a Replay

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