Question

J'ai une instruction select que je veux utiliser comme base pour ajouter plus de lignes à une table. Certaines colonnes auront des colonnes modifiées et la ligne d'origine devra également être modifiée.

Ceci est une occurrence unique et la base de données peut être mise hors ligne si cela vous aide.

Des idées?

Merci, Joe

===================

Description de la mise à jour

Table MBANK

       |MID  |MAGN|MAAID|MTYPEOT|        MAVAILS|MUSER|MTS
OLD    |65   |   9|    3|      2|              A|NAME |20090909
NEW    |65   |  10|    0|      2|              A|NAME |20090910
CHANGE |SAME |  +1| TO 0|   SAME|New = A Old = O|SAME |TIMESTAMP

Ceci devra être fait pour environ 4000 enregistrements sur une sélection.

sélectionnez * dans MDSTD.MBANK où MTYPEOT = '2' et MAVAILS = 'A'

Était-ce utile?

La solution

La solution DrJokepu ne pose pas de problème, mais cela dépend de ce que vous appelez " Changes " dans votre question, est fixe. I.e .: allez-vous toujours changer +1 pour la 2ème colonne? Ou ces modifications sont-elles "dynamiques"? d'une manière vous devez décider à l'exécution quelles modifications vous allez appliquer?

Il existe dans DB2 et dans toute autre construction SQL différente (comme l'insertion dans dans DB2) ou SELECT INTO pour MS-SQL qui vous permettra de construire un ensemble de requêtes.

Si je ne me trompe pas, vous voulez faire ceci:

  1. Insérez dans une table des valeurs provenant d'un select (que vous appelez "ancien")
  2. Créez un autre ensemble d'enregistrements (comme les "anciens") mais modifiez leurs valeurs.

Ou peut-être que vous voulez juste faire le numéro 2.

Le numéro 1 est simple, comme l'a déjà souligné le DrJokepu:

INSERT INTO <table> (values) SELECT "values" FROM <anotherTable>;

Vous pouvez toujours faire la même chose dans la même requête en ajoutant les modifications au fur et à mesure que vous sélectionnez:

INSERT INTO MDSTD.MBANK ( MID, MAGN, MAAID, MTYPEOT, MAVAILS, MUSER, MTS)
SELECT 
      MID 
     ,MAGN + 1
     ,0 as MAAID
     ,MTYPEOT
     ,'A' as MAVAILS
     ,MUSER
     ,GETDATE() 
FROM mdstd.mbank 
WHERE MTYPEOT = '2' and MAVAILS = 'A'

(notez que GETDATE () est une fonction MS-SQL, je ne me souviens pas de la fonction exacte pour DB / 2 pour le moment).

Il reste une question, dans votre exemple, vous avez mentionné:

"Nouveau = Un ancien = O"

Si Old est remplacé par "O", vous souhaitez vraiment modifier la ligne d'origine? la réponse à cette question dépend de la tâche que vous souhaitez accomplir, tâche qui n’est pas encore claire pour moi.

Si vous souhaitez dupliquer les lignes et modifier les " copies " ou les copier et changer les deux ensembles (ancien et nouveau) mais en utilisant des règles différentes.

MISE À JOUR Après avoir relu votre message, je comprends que vous souhaitiez le faire:

  1. Dupliquez un ensemble d'enregistrements (en les copiant effectivement) mais en modifiant leurs valeurs.
  2. Modifiez l'ensemble d'enregistrements d'origine avant de les dupliquer

Si tel est le cas, je ne pense pas que vous puissiez le faire en "deux". requêtes, car vous n'aurez aucun moyen de savoir quelle est l'ancienne ligne et quelle est la nouvelle si vous avez déjà dupliqué.

Une option valide consiste à créer une table temporaire et à y copier les lignes (modifiez-les comme les "nouvelles" avec la requête que j'ai fournie). Ensuite, dans la table d'origine, exécutez un " update " (en utilisant la même clause WHERE pour vous assurer que vous modifiez les mêmes lignes), mettez à jour l'ancien " ancien " valeurs avec ce que vous voulez mettre à jour et insérez enfin les nouvelles dans la table d'origine (ce que nous avons appelé "nouvelles") déjà modifiées. Enfin, supprimez la table temporaire.

Ouf!

Ça a l'air bizarre, mais à moins que nous ne parlions de zillions de disques toutes les minutes, cela devrait être une sorte d'opération rapide.

Autres conseils

Vous pouvez utiliser INSERT ... SELECT, qui est une construction spécifique à DB2:

INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337

Et dans la même transaction, vous effectuez une mise à jour avec la même clause where, si vous souhaitez modifier les lignes d'origine:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

Etant donné que DB2 prend en charge plusieurs commandes dans un même lot, vous pouvez les combiner ensemble:

INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337;
UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top