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 Oracle Discussion :

Requête pour la mise à jour d'une table


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut Requête pour la mise à jour d'une table
    Bonjour a tous,

    J'ai une question sûrement très bête et facile pour les pros sur SQL mais moi c'est pas mon truc.

    J'ai une table A avec plusieurs colonnes dont 2 bien particulière:
    une colonne produit_id et une colonne quantité.

    Dans une table B, j'ai plusieurs colonnes dont également 2 colonnes avec produit_id et une colonne quantités.

    Je souhaiterais faire un update de la Table A avec les quantités de la table B
    un truc du style

    Update table A
    set quantité A = quantité B when produit_id A = produit_id B

    J'espère avoir été clair. D'avance merci pour votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Utilisez MERGE

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Bonjour,

    Il y a plusieurs moyens de faire cette opération.

    Vous pouvez faire un update tout simple avec une sous-requête pour récupérer la donnée souhaitée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TABLE_A a
    SET quantite = (SELECT quantite
                    FROM   TABLE_B b
                    WHERE  b.produit_id = a.produit_id);
    Ou bien utiliser l'ordre MERGE (syntaxe plus complexe que la première solution, mais plus approprié à la situation; on pourra également l'adapter par la suite, par exemple pour insérer une nouvelle ligne quand on ne trouve pas dans table_a le produit_id trouvé dans table_b; ce n'est pas pour rien que skuatamad vous l'a conseillé pendant que j'écrivais) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MERGE INTO TABLE_A a
    USING TABLE_B b
    ON (a.produit_id = b.produit_id)
    WHEN MATCHED THEN UPDATE SET a.quantite = b.quantite;

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Baldrick Voir le message
    ....

    Vous pouvez faire un update tout simple avec une sous-requête pour récupérer la donnée souhaitée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TABLE_A a
    SET quantite = (SELECT quantite
                    FROM   TABLE_B b
                    WHERE  b.produit_id = a.produit_id);
    Où comment mettre des valeurs à null si la condition de jointure n'est pas réalisée.

    Cette requete est totalement différente de l'autre proposée avec un merge.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Merci a tous les 2. J'essaie ça dès ce soir!!!

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Où comment mettre des valeurs à null si la condition de jointure n'est pas réalisée.

    Cette requete est totalement différente de l'autre proposée avec un merge.
    Good point. Je crois que j'ai gagné le droit de copier cent fois "Je n'oublierai pas les valeurs NULL" pour demain.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Je viens d'essayer et aucune des 2 ne fonctionne.

    L'update me dit: sous interrogation ramenant un enregistrement de plus d'une ligne

    La technique merge me dit a.produit_id non definit...

    Qui dit mieux??

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Plus d'une ligne retournée ? produit_id n'est donc pas la clé de table_B ?

    Alors, nous avons besoin d'une information supplémentaire pour notre condition de mise à jour : dans le cas où il y a plusieurs lignes pour un même produit_id, comment peut-on déterminer celle qui doit faire foi ?

    Et pour ce qui est de a.produit_id non défini... J'avoue que je ne lai jamais rencontrée... Est-ce que vous pouvez donner le code de l'erreur ?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    L erreur avec merge est ORA-00904.

    Il ne me paraît pourtant impossible que dans la table b figure 2 fois le même produit_id sachant que oui produit_id n est pas la clé de la table b

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Alors autant pour moi, effectivement dans la table b, produit_id peut être de la même valeur. Ceci dit, la quantité associée aux n lignes du même produit_id est toujours la même, seul le prix du produit change.

    J ai donc 3 lignes par exemple pour un même produit id. Les 3 lignes indiquent la même quantité. Donc peu importe la ligne que je choisi pour faire mon up date de la table À. Un critère différenciant les 3 lignes est une colonne de la table b s appelant Type_prix et pouvant prendre la valeur 1 2 ou 3. Ainsi finalement chaque produit_id est présent 3 fois dans la table b avec 3 lignes: une en type_prix1, une en type_prix 2 et l autre en type_prix 3

  11. #11
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Tu peux prendre le max(quantite) par exemple (min marcherait aussi, le but étant d'agréger par produit pour n'en avoir qu'un).

    Quant à l'erreur que tu obtiens, il faut débugger la requête concrète. Donne nous par exemple un CREATE TABLE simplifié pour qu'on puisse reproduire l'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MERGE INTO TABLE_A a
    USING (SELECT max(quantite) quantite, produit_id
              FROM TABLE_B
              GROUP BY produit_id) b
    ON (a.produit_id = b.produit_id)
    WHEN MATCHED THEN UPDATE SET a.quantite = b.quantite;

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    pacman, meme erreur 0904 avec ton code

    la table T_PRODUITGEOGRAPHIQUE (table A)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE ERP.T_PRODUITGEOGRAPHIQUE
    (
      T_PRODGEO_ID    NUMBER(9)                     NOT NULL,
      STOCKMINI       NUMBER(5)                     NOT NULL,
      STOCKMAXI       NUMBER(5),
      PRIORITE        NUMBER(3)                     NOT NULL,
      DATEMAJPRODGEO  DATE                          NOT NULL,
      T_DEPOT_ID      NUMBER(9)                     NOT NULL,
      T_PRODUIT_ID    NUMBER(10)                    NOT NULL,
      T_ZONEGEO_ID    NUMBER(9),
      QUANTITE        NUMBER(5)                     NOT NULL,
      DATE_DER_INV    DATE,
      DEPOTVENTE      NUMBER(1)                     DEFAULT 1                     NOT NULL,
      T_OPERATEUR_ID  NUMBER(9)
    la table B T_PRODUIT_COPIE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE ERP.T_PRODUIT_COPIE
    (
      PRODUIT_ID              NUMBER(10),
      PRIXACHAT               NUMBER(10,3),
      QTE1                    NUMBER(5),
      DATECOPIE               DATE,
      TYPE_PRIX               NUMBER(1)             DEFAULT 2,
      STUPEFIANT              CHAR(1 BYTE)          DEFAULT '0'                   NOT NULL,
      NB_MODE_ADMINISTRATION  NUMBER(4),
      T_TVA_ID                NUMBER(10),
      T_TVA_TAUX              NUMBER(5,2),
      DECONDITIONNABLE        CHAR(1 BYTE)          DEFAULT '0'                   NOT NULL
    Merci pour votre aide

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pensez à fournir quelques lignes qui posent problème en plus des scripts des tables, sinon ce n'est que de la déco.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Je comprends pas la remarque....

    Vous avez la structure des tables, j'ai indiqué mon souhait, les numéros des erreurs, que la table B n'avait pas de PK. Le PK de la table A est T_PRODGEO_ID (mais on s'en fout)

    J'ai indiqué que dans la table B, un même produit_id avait 3 lignes chacune avec un TYPE_PRIX à 1 2 ou 3 mais que chaque ligne avait une QTE1 identique et que donc pour le MERGE je pouvais faire un select * FROM T_PRODUIT_COPIE WHERE TYPE_PRIX = 1 2 ou 3 indifféremment pusique la valeur QTE1 de la ligne correspondante est la même.

    ET j'ai toujours cette putain d'erreur A.prdouit_id non défini erreur 00904!!

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    toutefois voici 2 fichiers excel avec les 10-20 premières lignes d'export de chaque table
    Fichiers attachés Fichiers attachés

  16. #16
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Dans la table A, la colonne s'appelle t_produit_id. Tu as bien écrit a.t_produit_id dans la requête, et non a.produit_id ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    "Le temps ne fait rien à l'affaire, quand on est con... on est con..........."

    Non mais quelle buse je suis!!! Bien évidemment!!!

    Merci pacmann pour tes lumières.

    J'ai pourtant regardé 10x et je n'ai jamais vu qu'effectivement la colonne dans cette table s'appelait t_Produit_ID au lieu de produit_id comme dans 99% des autres tables!!!


    Un grand merci a toi et autres. J'ai finalement juste ajouté au code la condition TYPE_PRIX=2 pour filtrer les produit_id de la table B qui existent plusieurs fois

    Code final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MERGE INTO table_A a
    USING (SELECT * FROM TABLE_B WHERE TYPE_PRIX=2) b
    ON( a.t_produit_id = b.produit_id)
    WHEN MATCHED THEN UPDATE SET a.quantite = b.qte1
    Merci a tous encore une fois!!!!

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/01/2012, 21h11
  2. Mise à jour d'une table à partir du résultat d'une requête
    Par zoharcryss dans le forum Langage SQL
    Réponses: 12
    Dernier message: 18/08/2009, 15h33
  3. [AC-2003] Mise à jour d'une table depuis requête regroupement
    Par buzz73 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/07/2009, 12h09
  4. Mise à jour d'une table à partir d'une requête
    Par erwan.bodere dans le forum SQL
    Réponses: 4
    Dernier message: 04/09/2008, 19h27
  5. Réponses: 3
    Dernier message: 18/07/2007, 17h20

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