Pergunta

Eu tenho uma instrução SELECT que eu quero usar como base para a adição de mais linhas a uma tabela. As novas linhas terá algumas colunas modificado e a linha original terá que ser alterado também.

Esta é uma vez fora ocorrência ea DB pode ser tirado do ar se isso ajuda.

Todas as idéias?

Obrigado, Joe

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

Descrição Atualização

mBank Tabela

       |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

Isso terá de ser feito por cerca de 4000 registros em um select.

SELECT * FROM MDSTD.MBANK onde MTYPEOT = '2' e MAVAILS = 'A'

Foi útil?

Solução

solução

DrJokepu é ok, mas isso depende se o que você chama de "alterações" na sua pergunta, é fixo. I.e .: você está sempre vai mudar +1 para a 2ª coluna? Ou são essas mudanças "dinâmicos" em uma maneira que você tem que decidir sobre runtime que muda você está indo para aplicar?

Existem no DB2 e qualquer outro SQL construções diferentes (como INSERT INTO no DB2) ou SELECT INTO para MS-SQL que permitirá que você para construir um conjunto de consultas.

Se não me engano, você quer fazer isso:

  1. Inserir alguns valores em uma tabela que vêm de um select (o que você chama de "velha")
  2. Criar um outro conjunto de registros (como os "antigos"), mas modificar seus valores.

Ou talvez você só quer fazer o número 2.

Number 1 é fácil, como Dr.Jokepu já mostrei-lhe:

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

Número 2, você sempre pode fazer na mesma consulta, adicionando as mudanças que você selecione:

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 o GETDATE () é uma função MS-SQL, não me lembro a função exata para DB / 2 neste momento).

Uma pergunta permanece, no seu exemplo que você mencionou:

"New = Um Velho = O"

Se as mudanças velhos em "O", então você realmente quer mudar a linha original? a resposta a esta questão depende da tarefa exato que você quer realizar, que ainda não está claro para mim.

Se você deseja duplicar as linhas e alterar as "cópias" ou copiá-los e mudar ambos os conjuntos (antigos e novos), mas usando regras diferentes.

Atualizar Depois de reler seu post eu entendo que você quer fazer isso:

  1. Duplicar um conjunto de registros (efetivamente copiá-los), mas modificar seus valores.
  2. Modificar o conjunto original de registros antes você duplicado los

Se for esse o caso, eu não acho que você pode fazê-lo em "dois" consultas, porque você não terá nenhuma maneira de saber qual é a linha antiga e qual é o novo se você já duplicado.

A opção válida é criar uma tabela temporária, copie as linhas lá (modificá-los como os "novos) com a consulta que eu forneci). Em seguida, na tabela original executar um 'update' (usando o mesmo ONDE CLÁUSULA para se certificar de que você está modificando as mesmas linhas), atualize os "velhos" valores com o que você deseja atualizar e, finalmente, inserir os novos de volta para a tabela original (o que chamamos de "novo") que já são modificados. Finalmente, a tabela da gota a temperatura.

Ufa!

Parece estranho, mas a menos que nós estamos falando sobre zilhões de registros a cada minuto, este deve ser um tipo de operação rápida.

Outras dicas

Você pode usar INSERT ... SELECT, que é uma construção específica do DB2:

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

E, em seguida, na mesma transação, você faz uma atualização com a mesma onde cláusula, se você wan para modificar as linhas originais:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

Como o DB2 suporta múltiplos comandos em um único lote, você pode lote-los juntos:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top