2009-09-11 6 views
3

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

Ceci est une occasion unique et le DB peut être mis hors ligne si cela aide.

Des idées?

Merci, Joe

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

Description Mise à jour

mBank Tableau

 |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

Cela devra être fait pour environ 4000 enregistrements sur un select.

select * from MDSTD.MBANK où MTYPEOT = '2' et MAVAILS = 'A'

+0

Pouvez-vous expliquer un peu plus votre idée? Un petit échantillon aidera. Vous pouvez utiliser SELECT INTO (et façonner votre select/into comme vous le souhaitez), mais si vous avez besoin de modifier la table "original", vous aurez besoin d'une procédure stockée dans DB2. –

Répondre

3

DrJokepu solution est ok, mais cela dépend si ce que vous appelez "Changes" dans votre question, est corrigé. I.e .: allez-vous toujours changer +1 pour la 2ème colonne? Ou ces changements sont-ils «dynamiques» d'une manière que vous devez décider lors de l'exécution quels changements vous allez appliquer?

Il existe dans DB2 et d'autres constructions SQL différentes (comme l'insertion 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. Insertion de valeurs dans une table qui proviennent d'une sélection (ce que vous appelez « vieux »)
  2. Créer un ensemble d'enregistrements (comme les "anciens") mais modifient leurs valeurs.

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

Numéro 1 est facile, comme le DrJokepu déjà vous a montré:

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

Numéro 2, vous pouvez toujours faire la même requête, en ajoutant les modifications 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 le GETDATE() est une fonction MS-SQL, Je ne me souviens pas de la fonction exacte pour DB/2 en ce moment).

Une question reste, dans votre exemple vous avez mentionné:

"Nouveau = A Old = O"

Si anciens changements "O", alors vous voulez vraiment changer la ligne d'origine? la réponse à cette question dépend de la tâche exacte que vous voulez accomplir, ce qui n'est toujours pas clair pour moi.

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

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

  1. dupliquer un ensemble d'enregistrements (les copier efficacement) mais modifier leurs valeurs.
  2. Modifier l'ensemble des documents originaux avant vous les dupliquées

Si tel est le cas, je ne pense pas que vous pouvez le faire dans les requêtes « deux », parce que vous aurez aucun moyen de savoir quelle est la vieille rangée et quelle est la nouvelle si vous avez déjà dupliqué.

Une option valide est de créer une table temporaire, copiez les lignes là (les modifier comme les "nouveaux") avec la requête que j'ai fournie) Puis dans la table d'origine, exécutez une "mise à jour" (en utilisant le même WHERE CLAUSE pour vous assurer que vous modifiez les mêmes lignes), mettez à jour les "anciennes" valeurs avec tout ce que vous voulez mettre à jour et enfin insérez les nouvelles dans la table d'origine (ce que nous appelons "new") déjà modifiées. Enfin, laissez tomber la table temporaire.

Ouf!

sons bizarres, mais à moins que nous parlons zillions de dossiers chaque minute, cela devrait être une sorte d'opération rapide.

2

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 puis dans la même transaction, vous faites une mise à jour avec la même clause where, si vous blême pour modifier les lignes d'origine:

UPDATE MY_TABLE 
SET LOL = 9000 
WHERE ID = 1337 

Depuis DB2 prend en charge plusieurs commandes en un seul lot, vous pouvez les lots toget son:

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; 
+1

L'OP ne dit pas que les lignes anciennes et nouvelles peuvent être identifiées par ID, donc il n'aurait pas le moyen de mettre à jour le "jeu original" si la même clause WHERE renvoie les mêmes lignes (plus les nouvelles insérées). –

Questions connexes