(Firebird) update em uma coluna de uma tabela x condição tabela y

24/07/2018

0

Amigos, estou com um problema, preciso dar um update em uma tabela (produto), e tem como base desse update os dados de uma outra tabela (aliquota).
Fiz a seguinte Query, mas não sei por qual motivo ela não esta funcionando corretamente, simplesmente da update em todos os campos ignorando o where.

por exemplo lançou = '3' para todos os dados sobrescrevendo os update acima dele.

update produto set codregranfe1 = '1'
WHERE EXISTS (SELECT claisento
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'T'
                 );

COMMIT WORK;

update produto set codregranfe1 = '3'
WHERE EXISTS (SELECT claisento
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'I'
                 );

COMMIT WORK;

update produto set codregranfe1 = '2'
WHERE EXISTS (SELECT claisento
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'S'
                 );

COMMIT WORK;

update produto set codregranfe1 = '5'
WHERE EXISTS (SELECT claisento
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'N'
                 );

COMMIT WORK;
David

David

Responder

Posts

31/07/2018

Felipe Morais

Boa noite, David

Tente isto (verifique os apóstrofes, pois a ferramenta de edição do fórum adiciona apóstrofes extras):

update produto set codregranfe1 = (SELECT '1'
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'T'
                 );
 
COMMIT WORK;
 
update produto set codregranfe1 = (SELECT '3'
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'I'
                 );
 
COMMIT WORK;
 
update produto set codregranfe1 = (SELECT '2'
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'S'
                 );
 
COMMIT WORK;
 
update produto set codregranfe1 = (SELECT '5'
                  FROM ALIQUOTA
                  WHERE ALIQUOTA.CLAISENTO = 'N'
                 );
 
COMMIT WORK;


Espero ter ajudado!
Responder

31/07/2018

Emerson Nascimento

para que isto funcione você precisa relacionar de alguma forma a tabela aliquota com a tabela produtos.
da forma como está o último update sempre irá sobrepor os anteriores.

deveria ser algo assim:
update produto set codregranfe1 =
 (select max(case CLAISENTO when 'T' then '1' when 'I' then '3' when 'S' then '2' else '5' end)
  from aliquota
  where aliquota.imposto = 'ICMS'
    and aliquota.cst = produto.cst_icms) -- note aqui é feito o relacionamento entre as tabelas

Lembrando que a instrução acima é somente para que você entenda como deve ser feito o relancionamento.
Se não há como relacionar a tabela aliquota com a tabela produto, não há como fazer a instrução funcionar como você precisa.
);
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar