Pregunta

Tengo una declaración de selección que quiero usar como base para agregar más filas a una tabla. Las nuevas filas tendrán algunas columnas modificadas y la fila original también tendrá que modificarse.

Esto ocurre solo una vez y la base de datos puede desconectarse si eso ayuda.

¿Alguna idea?

Gracias, Joe

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

Descripción de la actualización

Tabla de 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

Esto tendrá que hacerse para aproximadamente 4000 registros en una selección.

seleccione * de MDSTD.MBANK donde MTYPEOT = '2' y MAVAILS = 'A'

¿Fue útil?

Solución

La solución DrJokepu está bien, pero eso depende de si lo que llamas " Cambios " En tu pregunta, es fijo. Es decir: ¿siempre vas a cambiar +1 para la segunda columna? O son esos cambios " dinámicos " ¿De alguna manera tiene que decidir en tiempo de ejecución qué cambios va a aplicar?

Hay en DB2 y cualquier otra construcción SQL diferente (como la inserción en DB2) o SELECT INTO para MS-SQL que le permitirá construir un conjunto de consultas.

Si no me equivoco, quieres hacer esto:

  1. Inserte algunos valores en una tabla que provienen de una selección (lo que usted llama " antiguo ")
  2. Cree otro conjunto de registros (como los " antiguos ") pero modifique sus valores.

O tal vez solo quieras hacer el número 2.

El número 1 es fácil, ya que Dr.Jokepu ya te mostró:

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

Número 2 que siempre puede hacer en la misma consulta, agregando los cambios a medida que selecciona:

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'

(note que GETDATE () es una función MS-SQL, no recuerdo la función exacta para DB / 2 en este momento).

Queda una pregunta, en el ejemplo que mencionaste:

" Nuevo = A Old = O "

Si Antiguo cambia a " O " ;, entonces, ¿realmente quieres cambiar la fila original? La respuesta a esta pregunta depende de la tarea exacta que desea realizar, que aún no está clara para mí.

Si desea duplicar las filas y cambiar las " copias " o cópielos y cambie ambos conjuntos (antiguos y nuevos) pero usando reglas diferentes.

ACTUALIZACIÓN Después de releer tu publicación, entiendo que quieres hacer esto:

  1. Duplique un conjunto de registros (copiándolos efectivamente) pero modificando sus valores.
  2. Modificar el conjunto original de registros antes que los duplicó

Si ese es el caso, no creo que puedas hacerlo en " dos " consultas, porque no tendrás forma de saber qué es la fila anterior y cuál es la nueva si ya has duplicado.

Una opción válida es crear una tabla temporal, copiar las filas allí (modificarlas como "nuevas") con la consulta que he proporcionado). Luego, en la tabla original, ejecute una " actualización " (utilizando la misma CLÁUSULA DONDE para asegurarse de que está modificando las mismas filas), actualice la " antigua " Los valores con lo que desee actualizar y, finalmente, insertar los nuevos en la tabla original (lo que llamamos "nuevo") ya están modificados. Por último, suelta la tabla temporal.

¡Uf!

Suena raro, pero a menos que estemos hablando de millones de registros cada minuto, este debería ser un tipo de operación rápida.

Otros consejos

Podría usar INSERT ... SELECT, que es una construcción específica de DB2:

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

Y luego, en la misma transacción, realiza una actualización con la misma cláusula where, si desea modificar las filas originales:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

Dado que DB2 admite varios comandos en un solo lote, puede agruparlos:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top