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

DB2 Discussion :

Update multi rows


Sujet :

DB2

  1. #1
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut Update multi rows
    Hello,

    J'aimerais faire le traitement suivant, un update "massif", à savoir remplacer les anciens ID de TABLE1 (100,101,102) dans un clob par ceux dans la table de correspondance TABLE2 :

    TABLE1
    ---------------------------------------------------------------------------------------------------------------------------------
    ID(int) -------------------------------------------- DATA(clob)
    ---------------------------------------------------------------------------------------------------------------------------------
    1 --------------------------------------------- <data><ids><id>100</id><id>101</id><id>102</id></ids></data>
    ----------------------------------------------------------------------------------------------------------------------------------

    TABLE2
    ----------------------------------------------------------------------------------------------------------------------------------
    ID -- ANCIEN_ID -- NOUVEAU_ID --
    ----------------------------------------------------------------------------------------------------------------------------------
    1 -- 101 -- 233 --
    1 -- 102 -- 248 --
    1 -- 103 -- 255 --
    ----------------------------------------------------------------------------------------------------------------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TABLE1 T1 SET DATA=
    (
      SELECT replace(T1.DATA, T2.ANCIEN_ID, T2.NOUVEAU_ID) FROM TABLE2 T2 WHERE t2.ID=T1.ID
    )
    C'est un exemple (j'ai des milliers de lignes dans ce cas, je ne peux pas faire 3 requêtes ).

    Le problème : le select retourne évidemment pusieurs lignes et donc l'update échoue. Comment dois-je m'y prendre ?


    Merci !

    Info complémentaire : je suis sous DB2/AS400.

  2. #2
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 176
    Points : 291
    Points
    291
    Par défaut
    As-tu regardé une transformation XSLT via XSLTRANSFORM ? C'est très puissant (ça permet de faire des boucles, par exemple), mais c'est "un vrai métier" !
    Sinon, faire un UPDATE sur "quelques milliers" de lignes 3 fois d'affilée, ce n'est pas cela qui va mettre ton IBM i sur les rotules. C'est même plutôt son point fort : les traitements de masse. As-tu déjà mesuré le temps d'un UPDATE sur toute ta table ?

  3. #3
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut
    Merci pour ta réponse. Le problème est que je n'arrive pas à construire mon update.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TABLE1 T1 SET DATA=
    (
    SELECT replace(T1.DATA, T2.ANCIEN_ID, T2.NOUVEAU_ID) FROM TABLE2 T2 WHERE t2.ID=T1.ID
    )
    le moteur échoue en me disant que le select retourne plusieurs lignes.

  4. #4
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    ce que je ferai

    1) revoir la table TABLE2, avec 7 colonnes au lieu de 3 (ID, A1, N1, A2, N2, ...). avec ID comme index_unique et A* pour ancien, N* pour nouveau
    2) changer le sql en empilant les REPLACE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    REPLACE(REPLACE(REPLACE(T1.DATA, A1, N1), A2, N2),A3,N3)

    Sinon, reste la solution du programme

  5. #5
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut
    Impossible, j'ai des milliers de combinaisons anciens/nouveaux ID.

  6. #6
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    AMHA, avec SQL, ce n'est pas possible.

    Reste à écrire un beau programme ou tenter avec la méthose de pwrdwnsys (XLT je ne connais pas).

  7. #7
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut
    Merci pour vos réponses.

    Je suis surpris quand même que cette requête ne fonctionne pas. Rien ne devrait empêcher qu'il boucle x fois, car les nouveaux ID sont uniques...
    Même cette requête ne fonctionne pas :
    UPDATE TABLE1 T1 SET DATA=
    (
    SELECT REPLACE(T1.DATA, T2.ANCIEN_ID, T2.NOUVEAU_ID) FROM TABLE2 T2 WHERE "t1.ANCIEN_ID"=T2.NOUVEAU_ID
    )
    "t1.ANCIEN_ID" -> dans le data je cherche le nouvel ID (substr du t1.data avec un locate du T2.NOUVEAU_ID).

    Avec cette requête il ne fait qu'une seule mise à jour au lieu de 4
    Il doit bien existé une solution miracle

Discussions similaires

  1. Un UPDATE multi-table
    Par Séb. dans le forum Requêtes
    Réponses: 5
    Dernier message: 17/07/2008, 04h51
  2. [MySQL] Update multi inputs
    Par Him dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 05/06/2007, 04h04
  3. [Select] Problème de multi rows
    Par WwiloO dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2007, 11h41
  4. Réponses: 3
    Dernier message: 25/01/2005, 13h31
  5. UPDATE multi-tables sous SQL Server
    Par Cybernet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/03/2004, 16h34

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