Update no Firebird
Olá meus jovens.
Depois de muito bater cabeça eis que aqui estou. Estou habituado a dar updates no Firebird quando há uma comparação de um campo com outro. Porém esse caso é diferente e não consegui encontrar uma lógica para tal.
Vamos lá:
Tenho uma tabela X, com o campo plano, convenio, e codigo_empresa
Somente onde convenio=378, os planos tem preenchido também o codigo_empresa.
Preciso que os valores da codigo_empresa sejam atualizados para o convenio 378 também. Tentei da seguinte forma:
update cl_convenioplanos set codigo_empresa = (select codigo_empresa from cl_convenios where convenio=378) where convenio=338
Mas sem sucesso. Tentei várias variações e também sem sucesso.
A estrutura da tabela está mais ou menos assim:
Handle | Plano | convenio| codigo_empresa
1 87 29
2 87 338 15
3 90 45
4 505 338 27
5 164 183
Alguém tem alguma dica pra mim conseguir que o valor de codigo_empresas(que está no convenio 338) ser replicado para as outras linhas?
Não posso fazer o campo receber ele mesmo porque ele pode receber valor vazio.
Depois de muito bater cabeça eis que aqui estou. Estou habituado a dar updates no Firebird quando há uma comparação de um campo com outro. Porém esse caso é diferente e não consegui encontrar uma lógica para tal.
Vamos lá:
Tenho uma tabela X, com o campo plano, convenio, e codigo_empresa
Somente onde convenio=378, os planos tem preenchido também o codigo_empresa.
Preciso que os valores da codigo_empresa sejam atualizados para o convenio 378 também. Tentei da seguinte forma:
update cl_convenioplanos set codigo_empresa = (select codigo_empresa from cl_convenios where convenio=378) where convenio=338
Mas sem sucesso. Tentei várias variações e também sem sucesso.
A estrutura da tabela está mais ou menos assim:
Handle | Plano | convenio| codigo_empresa
1 87 29
2 87 338 15
3 90 45
4 505 338 27
5 164 183
Alguém tem alguma dica pra mim conseguir que o valor de codigo_empresas(que está no convenio 338) ser replicado para as outras linhas?
Não posso fazer o campo receber ele mesmo porque ele pode receber valor vazio.
Diego
Curtidas 0
Melhor post
Douglas Sousa
24/04/2018
boa tarde,
não sei se entendi bem mais acredito que assim vc consegue fazer ele receber ele mesmo mas somente quando for o campo vazio segue :
caso nao seja isso volte a postar
não sei se entendi bem mais acredito que assim vc consegue fazer ele receber ele mesmo mas somente quando for o campo vazio segue :
update cl_convenioplanos
set codigo_empresa = codigo_empresa
where convenio = 338
and codigo_empresa is nullcaso nao seja isso volte a postar
GOSTEI 1
Mais Respostas
Diego
24/04/2018
Mas dessa forma ele somente vai setar o codigo_empresa quando o convênio for o 338...
É basicamente o contrário, somente quando não for o 338 que ele deve atualizar o registro codigo_empresa.
Usando essa sua mesma idéia e mudando para NOT IN
update cl_convenioplanos
set codigo_empresa = codigo_empresa
where convenio not in (338)
and codigo_empresa is null
Isso reproduziria o mesmo resultado que is not, e mesmo assim, puxaria um valor vazio para o campo.
Não sei se nesse caso não seria necessário eu trabalhar com uma View, que armazenasse o dado e jogasse ali.
É basicamente o contrário, somente quando não for o 338 que ele deve atualizar o registro codigo_empresa.
Usando essa sua mesma idéia e mudando para NOT IN
update cl_convenioplanos
set codigo_empresa = codigo_empresa
where convenio not in (338)
and codigo_empresa is null
Isso reproduziria o mesmo resultado que is not, e mesmo assim, puxaria um valor vazio para o campo.
Não sei se nesse caso não seria necessário eu trabalhar com uma View, que armazenasse o dado e jogasse ali.
GOSTEI 0
Fabricio Kawata
24/04/2018
Olá Diego! Se o contexto se trata de um update para uma condição exclusiva e restrita (convenio <> 338 and codigo_empresa is null), é esperado que você já tenha o novo valor a ser atribuído (neste caso, o código da empresa). Neste caso, extraia antes o valor para o "codigo_empresa" (via select) e atribua ele diretamente na instrução de "update". Não vejo outra forma de fazer isso, pois fazendo da primeira forma que você explicou (usando select para retornar o valor a ser usado no update), o valor atribuído ao campo será aleatório, e creio que isso não seja isso o esperado.
Abraço!
Abraço!
GOSTEI 1
Diego
24/04/2018
Sim... É que no caso, somente o convenio 338 TEM o campo codigo_empresa preenchido, o resto dos convênios, não.
Pois é, tentei extrair os dados do update através de um select, porém como a resposta pro select daria mais do que uma linha, não funciona.
update cl_convenioplanos set codigo_empresa = (select codigo_empresa from cl_convenioplanos where convenio=338)
Esse select geraria multiplas linhas, então acredito que seria necessário um cursor for, mas não sei como implementá-lo no update.
Está mais ou menos assim:
http://oi68.tinypic.com/2447alg.jpg
Pois é, tentei extrair os dados do update através de um select, porém como a resposta pro select daria mais do que uma linha, não funciona.
update cl_convenioplanos set codigo_empresa = (select codigo_empresa from cl_convenioplanos where convenio=338)
Esse select geraria multiplas linhas, então acredito que seria necessário um cursor for, mas não sei como implementá-lo no update.
Está mais ou menos assim:
http://oi68.tinypic.com/2447alg.jpg
GOSTEI 0