Table of Contents

SINTAXE STATEMENT UPDATE MÚLTIPLO COM REGISTOS DE OUTRA TABELA

You are here:

É aconselhável que a TABELA ORIGEM seja uma tabela criada à medida com os campos “chave” (a serem usados no WHERE) e os campos para UPDATE
– A UM CAMPO ÚNICO:
update TABELA_DESTINO b set CAMPO_TABELA_DESTINO = (select a.CAMPO_TABELA ORIGEM from TABELA_ORIGEM a where b.CAMPO_CONDICAO_TABELA_DESTINO1 = a.CAMPO_CONDICAO_TABELA_ORIGEM1 [and b.CAMPO_CONDICAO_TABELA_DESTINO2 = a.CAMPO_CONDICAO_TABELA_ORIGEM2…]) where (CAMPOS_TABELA_DESTINO) in (select CAMPOS_TABELA ORIGEM from TABELA_ORIGEM)

– A VÁRIOS CAMPOS
update TABELA_DESTINO b set (CAMPO_TABELA_DESTINO1, CAMPO_TABELA_DESTINO2 [, CAMPO_TABELA_DESTINO3…] = (select a.CAMPO_TABELA ORIGEM1, a.CAMPO_TABELA ORIGEM2 [, a.CAMPO_TABELA ORIGEM3…] from TABELA_ORIGEM a where b.CAMPO_CONDICAO_TABELA_DESTINO1 = a.CAMPO_CONDICAO_TABELA_ORIGEM1 [and b.CAMPO_CONDICAO_TABELA_DESTINO2 = a.CAMPO_CONDICAO_TABELA_ORIGEM2…]) where (CAMPOS_TABELA_DESTINO) in (select CAMPOS_TABELA ORIGEM from TABELA_ORIGEM)
EXEMPLO:
Reactivar zeros fechados para poderem ser reactivados e processados novamente, para isso terá que se actualziar as quantidades da D0248 (Quantita_UMD1) e o std_f2 = null. Na D0268 o estado terá que passar a ’01’ e o std_f2 = null.
– obter os registos correctos da D0268:
 select * from D0268 where ente = ’12’ and status_applicativo = ‘N’ and ord_data_previstaini = ‘20190608’ and std_f1 = ‘1’
– criar uma tabela à medida com a chave a ser usada no update múltiplo e o campo de quantidade

 create table jg268 as select ord_tipo, ord_numero, ord_numero_conspre, ord_numero_riga, sum(quantita) “qtd” from D0268 where ente = ’12’ and status_applicativo = ‘N’ and ord_data_previstaini = ‘20190608’ and std_f1 = ‘1’ group by ord_tipo, ord_numero, ord_numero_conspre, ord_numero_riga

– [EM TEORIA APENAS PARA MYSQL] criar tabela com os registos de destino a serEM actualizados, este passo só deverá ser necessário para MYSQL, porque não gosta de actualizar registos a uma leitura da própria tabela
create table jg248 as select * from D0248 where (ord_legato_tipo, ord_legato_numero, ord_legato_conspre, ord_legato_riga) in (select ord_tipo, ord_numero, ord_numero_conspre, ord_numero_riga from D0268 where ente = ’12’ and status_applicativo = ‘N’ and ord_data_previstaini = ‘20190608’ and std_f1 = ‘1’)
– fazer o update prorpiamente dito, neste caso apenas a um campo (quantita_umd1 da D0248)
update D0248 b set std_f2 = null, quantita_umd1 = (select a.qtd from jg268 a where b.ord_legato_tipo = a.ord_tipo and b.ord_legato_numero = a.ord_numero and b.ord_legato_conspre = a.ord_numero_conspre and b.ord_legato_riga = a.ord_numero_riga) where (ord_legato_tipo, ord_legato_numero, ord_legato_conspre, ord_legato_riga) in (select ord_tipo,ord_numero,ord_numero_conspre,ord_numero_riga from jg268)

Se isto não funcionar, então é capaz de ser melhor começar a pensar num utilitário!! Não percas mais tempo nisto e segue!