linhas add DB2 SQL com base em outras linhas
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'
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:
- Inserir alguns valores em uma tabela que vêm de um select (o que você chama de "velha")
- 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:
- Duplicar um conjunto de registros (efetivamente copiá-los), mas modificar seus valores.
- 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;