Domanda

Ho un'istruzione select che voglio usare come base per aggiungere più righe a una tabella. Le nuove righe avranno alcune colonne modificate e anche la riga originale dovrà essere modificata.

Questo è un evento una tantum e il DB può essere portato offline se ciò aiuta.

Qualche idea?

Grazie, Joe

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

Descrizione aggiornamento

Tabella 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

Questo dovrà essere fatto per circa 4000 record su una selezione.

seleziona * da MDSTD.MBANK dove MTYPEOT = '2' e MAVAILS = 'A'

È stato utile?

Soluzione

La soluzione DrJokepu è ok, ma dipende se ciò che chiami " Cambia " nella tua domanda, è stato risolto. Ad es .: cambierai sempre +1 per la 2a colonna? Oppure queste modifiche sono "dinamiche" in un certo senso devi decidere in fase di runtime quali modifiche stai per applicare?

Esistono in DB2 e in qualsiasi altro SQL diversi costrutti (come l'inserimento in DB2) o SELECT INTO per MS-SQL che ti consentiranno di costruire una serie di query.

Se non sbaglio, vuoi farlo:

  1. Inserisci alcuni valori in una tabella che provengono da una selezione (ciò che chiami " vecchio ")
  2. Crea un altro set di record (come i "vecchi") ma modifica i loro valori.

O forse vuoi solo fare il numero 2.

Il numero 1 è facile, come ti ha già mostrato Dr.Jokepu:

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

Numero 2 che puoi sempre fare nella stessa query, aggiungendo le modifiche mentre selezioni:

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'

(nota che GETDATE () è una funzione MS-SQL, al momento non ricordo l'esatta funzione per DB / 2).

Rimane una domanda, nel tuo esempio hai menzionato:

" Nuovo = A Vecchio = O "

Se Vecchio cambia in " O " ;, allora vuoi davvero cambiare la riga originale? la risposta a questa domanda dipende dall'esatto compito che vuoi svolgere, il che non è ancora chiaro per me.

Se desideri duplicare le righe e modificare le " copie " oppure copiali e modifica entrambi i set (vecchi e nuovi) ma usando regole diverse.

Aggiorna Dopo aver riletto il tuo post, capisco che vuoi farlo:

  1. Duplica una serie di record (copiandoli efficacemente) ma modificandone i valori.
  2. Modifica il set di record originale prima di duplicarli

In tal caso, non credo che tu possa farlo in " due " domande, perché non avrai modo di sapere qual è la riga precedente e qual è la nuova se hai già duplicato.

Un'opzione valida è quella di creare una tabella temporanea, copiare le righe lì (modificarle come le nuove) con la query che ho fornito). Quindi, nella tabella originale, esegui un "aggiornamento" (utilizzando lo stesso CLAUSOLA DOVE per assicurarti di modificare le stesse righe), aggiorna il "vecchio" valori con qualunque cosa tu voglia aggiornare e infine reinserire quelli nuovi nella tabella originale (ciò che abbiamo chiamato "nuovo") che sono già stati modificati. Infine, rilascia la tabella temporanea.

Accidenti!

Sembra strano, ma a meno che non si parli di miliardi di dischi ogni minuto, questa dovrebbe essere una specie di operazione veloce.

Altri suggerimenti

È possibile utilizzare INSERT ... SELECT, che è un costrutto specifico per DB2:

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

E poi nella stessa transazione, fai un aggiornamento con la stessa clausola where, se vuoi modificare le righe originali:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

Poiché DB2 supporta più comandi in un singolo batch, è possibile raggrupparli insieme:

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top