IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Optimisation Update sur champs multiples


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut Optimisation Update sur champs multiples
    Bonjour,
    Je souhaiterais optimiser un update de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    update TablePrincipale
    set somme1=(select sum(montant1*produit)
    		FROM TableSecondaire
    		WHERE TablePrincipale.ID=TableSecondaire.ID
    	   )
    ,somme2=(select sum(montant2/produit)
    		FROM TableSecondaire
    		WHERE TablePrincipale.ID=TableSecondaire.ID
    	   )
    ,somme3=(select sum(montant1*produit)
    		FROM TableSecondaire
    		WHERE TablePrincipale.ID=TableSecondaire.ID
    	   )
    Comme vous le voyez, mes champs "somme1" et "somme3" sont calculés selon la même manière : je cherche donc à ne faire la sous requête qu'une seule fois. Je trouve comment faire sur oracle sur le net (syntaxe du genre update table set (somme1,somme3)=(select...) ) mais cette syntaxe n'est pas valable pour sql server.

    A noter : ma sous requête fait une jointure sur l'id de la table à mettre à jour : je ne pense donc pas pouvoir pré calculer la valeur de somme1 et somme 3 par avance

    Merci pour votre aide

  2. #2
    Membre du Club
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 63
    Points
    63
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE TablePrincipale
    Set somme1 = sum(ts.montant1*produit)
    , somme2 = sum(ts.montant2/produit)
    , somme3 = sum(ts.montant1*produit)
    FROM TablePrincipale  tp
    INNER JOIN TableSecondaire ts on ts.Id = tp.id

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Merci pour ton aide.
    Je teste ça dès que possible

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Sauf erreur de ma part (j'avais d'ailleurs déjà testé) celà ne marche pas à cause du "sum". Sql server me renvoit l'erreur "An aggregate may not appear in the set list ok un update statement"

    D'autres idées ?

  5. #5
    Membre du Club
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 63
    Points
    63
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE TablePrincipale
    SET somme1 = sum(ts.montant1*produit)
    , somme2 = sum(ts.montant2/produit)
    , somme3 = sum(ts.montant1*produit)
    FROM TablePrincipale  tp
    INNER JOIN TableSecondaire ts ON ts.Id = tp.id
    GROUP BY tp.id
    J'avais oublié que tu voulais un somme, donc il faut un group by

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Tu es sur qu'on peut faire un group by dans un update ?
    Je viens d'essayer par acquis de consience et j'arrive pas à le plugger sans erreur

  7. #7
    Membre du Club
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 63
    Points
    63
    Par défaut
    Dans ce cas ce que tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    select ID
    , Sum(montant1*produit) as somme1
    , Sum(montant2/produit) as somme2
    , Sum(montant1*produit) as somme3
    Into #temp
    FROM TableSecondaire
    group by ID
     
    UPDATE TablePrincipale
    SET somme1 = sum(ts.montant1*produit)
    , somme2 = sum(ts.montant2/produit)
    , somme3 = sum(ts.montant1*produit) 
    FROM #temp tp
    INNER JOIN TablePrincipale ts ON ts.Id = tp.id
    Mais je pense pas que ça soit la meilleur méthode.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Quelque chose dans ce goût :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    UPDATE TablePrincipale TP
    SET somme1 = temp.somme1
    , somme2 = temp.somme2
    , somme3 = temp.somme3
    FROM TP
     JOIN (
    	SELECT ID
    	, Sum(montant1*produit) AS somme1
    	, Sum(montant2/produit) AS somme2
    	, Sum(montant1*produit) AS somme3
    	FROM TableSecondaire
    	GROUP BY ID
    ) Temp
    	ON temp.ID = TP.ID
    Je n'ai pas testé.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Merci encore pour ton aide ATMorphine

    J'ai effectivement cette solution pour mon problème qui ne me convient qu'à moitié pour l'avoir testé au préalable (problème de place disque qui est limité et du nombre d'occurrence assez élevé)

    C'est pour celà que je cherchais à connaitre un syntaxe qui m'aurait échapé.

    Si personne d'autre n'a d'idées, je vais effectivement devoir m'y résoudre. dommage que ms sql serveur n'ai pas mis à dispo la même syntaxe qu'oracle

    @Jerome MTL : je teste celà illico. Merci

  10. #10
    Membre du Club
    Homme Profil pro
    SQL Server
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : SQL Server
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 63
    Points
    63
    Par défaut
    Je suis trop bête, c'est bien la bonne solution, je n'avais pas pensé a la sous requete pour calculer les sommes

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Je vais avoir du mal à tester ca avant lundi : on me tombe dessus!
    Je vous tien au courant dès que j'ai testé mais ca semble bon effectivement (je n'y ai pas pensé non plus !)

  12. #12
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    SVP, arrêtez d'utiliser des tables temporaires à torts et à travers !

    @++

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Merci atmorphine et Jerome MTL : la solution proposée fonctionne correctement et améliore sensiblement les choses.
    @elsuket : super interressent ton article

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation Update sur un champ blob
    Par bibi92 dans le forum SQL
    Réponses: 1
    Dernier message: 26/09/2008, 10h51
  2. Optimisation Update sur SQL SERVER 2000
    Par Hansen69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/12/2007, 22h17
  3. [Update] sur champ vide
    Par userB dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/06/2007, 10h22
  4. [ORACLE 9i]Update sur champs avec contrainte
    Par gowser dans le forum SQL
    Réponses: 11
    Dernier message: 14/06/2007, 14h40
  5. Index full text sur champs multiples
    Par manu_71 dans le forum Outils
    Réponses: 6
    Dernier message: 22/02/2007, 00h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo