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

SQL Firebird Discussion :

Update basé sur select query


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Homme Profil pro
    J'aime la programmation avec Delphi
    Inscrit en
    Avril 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : J'aime la programmation avec Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 227
    Points : 132
    Points
    132
    Par défaut Update basé sur select query
    Bonjour,

    je veut faire la mise à jour d'un champs on basant sur une somme d'un autre champs dans une autre table j'ai fait ce query mais ne fontionne pas bien ,il crase toutes les autres données de ce champs par la meme valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update ACHATS  b set 
    QUANTITE=(select sum(QUANTITE)   from ACHAT_DETAILS a where a.NUMERO_D_ACHAT=(SELECT max(ID_ACHAT) M_ID_ACHAT from ACHATS) group by a.NUMERO_D_ACHAT) ,

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    AMHA il manque la clause WHERE pour l'UPDATE
    si on enlève pour l'instant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (select sum(QUANTITE)   from ACHAT_DETAILS a where a.NUMERO_D_ACHAT=(SELECT max(ID_ACHAT) M_ID_ACHAT from ACHATS) group by a.NUMERO_D_ACHAT)
    on se retrouve avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update ACHATS  b set QUANTITE=<unevaleur>
    Donc toutes les lignes de la table auront la colonne QUANTITE = <unevaleur>

    le where il me semble serait WHERE A.ID_ACHAT=(SELECT max(ID_ACHAT) from ACHATS)
    mais franchement c'est pas très "propre" et simplifiable
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    extrêmement fatigué hier soir je n'avais pas vraiment détaillé ma réponse. Je résume et étaye.

    Vous avez donc une base de données avec deux tables :
    - ACHATS(ID_ACHAT,QUANTITE)
    - ACHATS_DETAILS(NUMERO_D_ACHAT,QUANTITE)
    la liaison (FOREIGN KEY ?) se faisant sur ACHATS(ID_ACHAT)<->ACHATS_DETAILS(NUMERO_D_ACHAT)

    Pour une raison peu orthodoxe, du moins pas très censée, à mon avis la colonne QUANTITE ne devrait pas exister dans ACHATS, vous voulez mettre à jour cette dernière celle-ci étant égale à la somme des quantités de ACHATS_DETAILS ayant le même NUMERO.
    Et, selon votre SQL, vous ne voulez mettre à jour que le "dernier Achat" SELECT max(ID_ACHAT) from ACHATSLa réponse serait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     update ACHATS  b set QUANTITE=(select sum(QUANTITE) from ACHAT_DETAILS a where a.NUMERO_D_ACHAT=(SELECT max(ID_ACHAT) from ACHATS))
              WHERE b.ID_ACHAT=(SELECT max(ID_ACHAT) from ACHATS)
    Loin d'être idéal et efficace d'un point de vue SGBD ! la moindre mise à jour d'un ACHAT_DETAILS et la QUANTITE de ACHATS devient fausse !

    A mon avis ce n'est pas votre but !
    je vous suggère de virer cette colonne ACHATS.QUANTITE.
    Vous allez certainement me répondre que vous en avez besoin pour un affichage résumé de la Table ACHATS, à cela je vous répondrai qu'il y a la possibilité d'obtenir cette valeur via SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NUMERO_D_ACHAT AS ID_ACHAT,SUM(QUANTITE) AS QUANTITEACHATS FROM ACHATS_DETAILS GROUP BY NUMERO_D_ACHAT
    comme je présume que bien sur ACHATS n'a pas que ces colonnes et que vous voulez tout ou partie de ces dernières la solution est de passer par une CTE (Common Table Expression)
    ce qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH S AS (SELECT NUMERO_D_ACHAT AS ID_ACHAT,SUM(QUANTITE) AS QUANTITEACHATS FROM ACHATS_DETAILS GROUP BY NUMERO_D_ACHAT)
    SELECT A.*,COALESCE(S.QUANTITEACHATS,0) AS QUANTITE  FROM ACHATS LEFT JOIN S ON A.ID_ACHAT=S.ID_ACHAT
    notez que j'ai rajouté la possibilité qu'il n'y ait aucun ACHATS_DETAILS pour un ACHATS, géré par le COALESCE

    et enfin, pour ne pas avoir à écrire cette requête régulièrement, rien ne vous empêche d'en faire une vue (VIEW)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre habitué
    Homme Profil pro
    J'aime la programmation avec Delphi
    Inscrit en
    Avril 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : J'aime la programmation avec Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 227
    Points : 132
    Points
    132
    Par défaut
    Bonjour Serge,

    Tu es un Star votre repense plus que suffisante et ça marche correctement pour vos remarques j'ai fait des ajouts des achats (exemple: un bon d'achat contient 5 articles avec des quantités et des prix différents ) après l’insertion de 5 articles dans une table nommé achat je refaire un calcul globale sur le nombre d’achats (comme c’est je saisi le bon d’achat) dans une autre table nommé achats ,là où je dois mettre un update selon le nouveau ajout
    C’est juste une explication merci encore une fois SergioMaster

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut à tous.

    Ce n'est pas une bonne idée de stocker la colonne "quantité" dans votre table "Achats".
    Mais si vous en avez besoin, utilisez une view pour recalculer votre colonne "quantité".
    Elle n'existera pas dans la table "Achats", mais avec le view, c'est comme si elle était présente.
    Et à chaque lancement de la view, vous aurez le calcul correcte de cette colonne.
    Tandis qu'avec votre méthode, le calcul sera souvent faux, pour cause de non mise à jour.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Requete Update basé sur une requete select
    Par Chagui dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/11/2010, 19h34
  2. Problème de jointure sur Select et Update
    Par Marshall_Mathers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/06/2007, 15h30
  3. Update avec un select sur la même table
    Par Xunil dans le forum Administration
    Réponses: 5
    Dernier message: 09/04/2007, 16h40
  4. Update Sql sur une Query Filtré
    Par Soulama dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/10/2006, 14h47
  5. [Res]Procédure stockée qui fait un insert basé sur un select
    Par wonderliza dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/12/2005, 18h25

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