Frage

Ich habe eine select-Anweisung, die ich als Grundlage verwenden möchten für mehrere Zeilen zu einer Tabelle hinzugefügt wird. Die neuen Reihen haben einige Spalten geändert und die ursprüngliche Zeile wird auch geändert werden müssen.

Dies ist ein einmalig Auftreten und die DB offline genommen werden kann, wenn das hilft.

Irgendwelche Ideen?

Danke, Joe

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

Beschreibung Update

mBank Tabelle

       |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

Dies wird für ca. 4000 Datensätze auf einer Auswahl getan werden.

select * from MDSTD.MBANK wo MTYPEOT = '2' und MAVAILS = 'A'

War es hilfreich?

Lösung

DrJokepu Lösung ist in Ordnung, aber das hängt davon ab, ob was Sie „Änderungen“ in Ihrer Frage stellen, festgelegt ist. D.h .: gehst du immer +1 für die 2. Säule ändern? Oder sind diese Änderungen „dynamisch“ in einer Weise, die Sie bei der Laufzeit entscheiden, welche Änderungen Sie gehen bewerben?

Es gibt in DB2 und alle anderen SQL verschiedenen Konstrukte (wie der Einsatz in in DB2) oder SELECT INTO für MS-SQL, dass Sie eine Reihe von Abfragen erstellen können.

Wenn ich mich nicht täusche, wollen Sie, dies zu tun:

  1. Legen Sie einige Werte in eine Tabelle, die von einer ausgewählten kommen (was man „alt“ nennen)
  2. Erstellen Sie eine weitere Gruppe von Datensätzen (wie die „alten“), aber ihre Werte ändern.

Oder vielleicht möchten Sie gerade tun Nummer 2.

Die Nummer 1 ist einfach, da Dr.Jokepu bereits zeigte Sie:

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

Number 2 Sie in derselben Abfrage immer tun können, und fügte hinzu, um die Änderungen, wie Sie wählen:

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'

(man beachte das GETDATE () ist eine MS-SQL-Funktion, ich habe nicht die genaue Funktion erinnere für DB / 2 in diesem Moment).

Eine Frage bleibt, in Ihrem Beispiel Sie erwähnt:

"New = A Old = O"

Wenn alte Änderungen auf „O“, dann wirklich Sie wollen die ursprüngliche Zeile ändern? die Antwort auf diese Frage hängt von der genauen Aufgabe, die Sie erreichen möchten, die noch nicht klar, für mich ist.

Wenn Sie möchten, um die Zeilen duplizieren und die „Kopien“ oder kopieren Sie sie ändern und beide Sätze ändern (alt und neu), aber mit unterschiedlichen Regeln.

UPDATE Nach dem Wiederlesen Ihrer Post Ich verstehe, wollen Sie, dies zu tun:

  1. Duplizieren einer Gruppe von Datensätzen (Kopieren sie effektiv), sondern modifizieren ihre Werte.
  2. Ändern Sie den ursprünglichen Satz von Datensätzen vor Sie dupliziert sie

Wenn das der Fall ist, ich glaube nicht, dass Sie es in „zwei“ Abfragen zu tun, weil Sie keine Möglichkeit haben werden zu wissen, was die alte Zeile ist und was die neue, wenn Sie bereits kopiert haben.

Eine gültige Option ist eine temporäre Tabelle zu erstellen, kopieren Sie die Zeilen dort (modifiziert, um sie als die „neuen) mit der Abfrage, die ich zur Verfügung gestellt habe). Dann in der ursprünglichen Tabelle ausführt ein‚update‘(die gleichen WHERE mit KLAUSEL um sicherzustellen, dass Sie die gleichen Zeilen sind zu ändern), aktualisieren Sie die „alten“ Werte mit dem, was Sie aktualisieren möchten, und schließlich die neuen einfügen wieder in die ursprüngliche Tabelle (was wir „neu“ genannt), die bereits modifiziert sind. Schließlich fallen die temporäre Tabelle.

Puh!

Klingt komisch, aber wenn wir über zig Millionen von Datensätzen zu sprechen sind jede Minute, dies sollte eine Art schnelle Bedienung sein.

Andere Tipps

Sie können INSERT ... SELECT, die ein DB2-spezifische Konstrukt:

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

Und dann in der gleichen Transaktion, machen Sie ein Update mit der gleichen where-Klausel, wenn Sie die ursprünglichen Zeilen ändern wan:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

Da unterstützt DB2 mehrere Befehle in einer einzigen Charge, Sie können Batch sie zusammen:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top