Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1924 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]Factorisation de sous-requêtes

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL]Factorisation de sous-requêtes

n°2007306
mv1975
Posté le 06-07-2010 à 09:44:32  profilanswer
 

Bonjour,
 
J'ai une requête qui fait plusieurs fois appel à une même sous-requête. J'aurais aimé savoir s'il était possible de factoriser ses sous-requêtes. J'ai essayé avec CREATE FUNCTION sans succès, car je n'arrive pas à faire un SELECT dans une fonction.
 
Merci par avance :)

mood
Publicité
Posté le 06-07-2010 à 09:44:32  profilanswer
 

n°2007307
skeye
Posté le 06-07-2010 à 09:48:54  profilanswer
 

Il va falloir expliquer mieux le problème, là...?


---------------
Can't buy what I want because it's free -
n°2007318
mv1975
Posté le 06-07-2010 à 10:23:36  profilanswer
 

Ok :)
Un exemple court (dans mon problème mes requêtes sont trèèèès longues) :
 

> SELECT `tempo`.`minutes`*60*(SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`) AS 'temps_de_chute',
         `tempo`.`distance`*(SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`) AS 'distance_de_chute'
  FROM `tempo`;


Je me retrouve avec 2 sous-requêtes.
Je me suis d'abord demandé s'il était possible de n'appeler qu'une seule fois la sous-requête par enregistrement de tempo(ce serait je pense idéal) :
 

> SELECT (SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`) AS 'nbchutes',
         `tempo`.`minutes`*60*`nbchutes` AS 'temps_de_chute',
         `tempo`.`distance`*`nbchutes` AS 'distance_de_chute'
  FROM `tempo`;


... Mais ça ne marche pas, car lemoteur SQL ne reconnait pas `nbChutes`; alors je me suis dit d'au moins rendre la requête plus lisible, en factorisant l'appel par une fonction :
 

> CREATE FUNCTION nbChutes (id int(11)) RETURNS int(11)
  RETURN (SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`);
 
> SELECT `tempo`.`minutes`*60*nbChutes(`tempo`.`id_maladroit`) AS 'temps_de_chute',
         `tempo`.`distance`*nbChutes(`tempo`.`id_maladroit`) AS 'distance_de_chute'
  FROM `tempo`;


Mais bien évidement, il ne m'est pas autorisé de faire un SELECT dans une fonction ...
 
Voilà, j'espère que c'est un peu plus clair

n°2007323
lasnoufle
La seule et unique!
Posté le 06-07-2010 à 10:38:50  profilanswer
 

Putain c'est quoi cette syntaxe avec toutes ces quotes, c'est illisible.
Je propose:

SELECT t.minutes*60*temp.nbchutes "Temps de chute",
t.distance*temp.nbchutes "Distance de chute"
FROM tempo t JOIN (SELECT id_maladroit, COUNT(*) nbchutes FROM chutes GROUP BY id_maladroit) temp ON t.id_maladroit = temp.id_maladroit;


Sinon pour la fonction, je suppose qu'il manque une étape ou tu affectes le résultat de la requete à une variable, et c'est cette variable que tu dois renvoyer.


Message édité par lasnoufle le 06-07-2010 à 10:40:33

---------------
C'était vraiment très intéressant.
n°2007324
skeye
Posté le 06-07-2010 à 10:41:03  profilanswer
 

quel sgbd? Tu ne peux pas tout simplement faire tes calculs dans le langage appelant, s'il y en a un?
 
Sinon tu peux probablement faire un truc de ce genre-là :
 

Code :
  1. SELECT minutes*60*nbchutes, distance*nbchutes
  2. FROM
  3. SELECT id_maladroit, minutes, distance, count(*) AS nbchutes
  4. FROM tempo
  5.           JOIN chutes ON chutes.id_maladroit = tempo.id_maladroit
  6. GROUP BY id_maladroit, minutes, distance


---------------
Can't buy what I want because it's free -
n°2007333
mv1975
Posté le 06-07-2010 à 10:59:45  profilanswer
 

sgbd = mysql
J'ai pris l'habitude de toujours quoter mes champs et mes tables.
 
Apparemment, la solution se trouve dans les jointures : merci à vous deux, je vais étudier cela avec attention !!

n°2007338
rufo
Pas me confondre avec Lycos!
Posté le 06-07-2010 à 11:24:02  profilanswer
 

- regardes si tu peux pas virer le count(*). En général, on évite de mettre le *,
- regardes si t'as bien mis les index sur les bons champs (regardes avec la fonction EXPLAIN).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2007339
skeye
Posté le 06-07-2010 à 11:28:14  profilanswer
 

rufo a écrit :

- regardes si tu peux pas virer le count(*). En général, on évite de mettre le *,


branlage de nouille.:o


---------------
Can't buy what I want because it's free -

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]Factorisation de sous-requêtes

 

Sujets relatifs
Trigger SQL sur colonne UpdateAccess / Entrer des valeurs au format numérique par SQL
quel logiciel pour faire du SQL sur des GROS fichiers bruts (csv)?Lancement de requête Sql automatisé
Eviter les failles XSS et les injections SQLUrgent SQL vers Oracle
requetesSQL: my.cnf : un vrai site qui explique les options en details ?
Requetes classées par date 
Plus de sujets relatifs à : [SQL]Factorisation de sous-requêtes


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR