[SQL/Access] problème pour une requête en apparence assez simple

problème pour une requête en apparence assez simple [SQL/Access] - SQL/NoSQL - Programmation

Marsh Posté le 13-12-2006 à 19:50:13    

Bonjour à tous,
 
Je suis dans une impasse pour une requête SQL sous Access, peut etre allez vous pouvoir me débloquer :)
Je vous expose mon problème :
 

Code :
  1. TABLE Commande
  2. client  descriptionProduit prixProduit
  3. --------------------------------------------------------------------------------------
  4. 1   "produit 1"   10
  5. 1   "produit 2"   5
  6. 1   "produit 3"   40
  7. 2   "produit 2"   5
  8. 2   "produit 1"   10


 
Comment récupérer, pour chaque client, le prix et la description du produit le moins cher, et le prix et la description du produit le plus cher
 
En l'occurrence, le résultat attendu avec cette requête doit être :
 
client     descriptionProduitMoinsCher      prixProduitMoinsCher     descriptionProduitPlusCher      prixProduitPlusCher  
1                     produit 2                                 5                                  produit 3                       40
2                     produit 2                                 5                                  produit 1                       10
 
 
j'ai déja cette requête qui marche :
 

Code :
  1. SELECT DISTINCT c1.client, c1.descriptionProduit, c1.prixProduit, c2.descriptionProduit, c2.prixProduit
  2. FROM commande AS c1, commande AS c2
  3. WHERE c1.prixProduit =( 
  4. SELECT MIN(c.prixProduit)
  5. FROM commande c
  6. WHERE c1.client = c.client
  7. )
  8. AND c2.prixProduit =( 
  9. SELECT MAX(c.prixProduit)
  10. FROM commande c
  11. WHERE c1.client = c.client
  12. );


 
masi a cause des requêtes imbriquées, lorsque j'atteint les grosses quantités d'enregistrements, ca ne passe plus, la requete n'en fini plus ...
 
 
Merci d'avance !


Message édité par ze nerdz le 13-12-2006 à 19:50:48
Reply

Marsh Posté le 13-12-2006 à 19:50:13   

Reply

Marsh Posté le 14-12-2006 à 15:26:37    

Pour améliorer le temps de traitement, il existe plusieurs solutions :
 
- supprimer le "DISTINCT'
- divisier la requête en plusieurs parties, par exemple rechercher d'abord les prix maximums puis les prix minimums
- indexer tous les champs qui servent à la sélection
- changer la structure des tables, en ajoutant un champ prix_max et un champ prix_min, qui seraient remplis lors de l'enregistrement des prix ; l'insertion ou la mise à jour serait un tout petit peu moins rapide, mais la selection serait beaucoup plus rapide.

Reply

Marsh Posté le 14-12-2006 à 21:15:48    

je peux me gourrer mais ce ne serait pas plutot:
 

Code :
  1. SELECT DISTINCT c1.client, c1.descriptionProduit, c1.prixProduit, c2.descriptionProduit, c2.prixProduit
  2. FROM commande AS c1, commande AS c2
  3. WHERE c1.prixProduit =( SELECT MIN(c.prixProduit)   
  4.                                  FROM commande c   
  5.                                  WHERE c1.client = c.client)
  6. AND c2.prixProduit =(SELECT MAX(c.prixProduit)   
  7.                             FROM commande c   
  8.                             WHERE c2.client = c.client)
  9. and c1.client=c2.client;


 
et mets juste un index sur client

Reply

Sujets relatifs:

Leave a Replay

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