Update campo com valor de outra tabela - oracle

8 respostas
oracle11
R

Senhores,
Gostaria de uma ajuda.

#update no campo com valor de outra tabela

SELECT  CD_MUNICIPIO_IBGE FROM pessoa_fisica WHERE CD_MUNICIPIO_IBGE is null

SELECT  CD_MUNICIPIO_IBGE FROM compl_pessoa_fisica

UPDATE pessoa_fisica SET CD_MUNICIPIO_IBGE = CD_MUNICIPIO_IBGE

Preciso que na tabela pessoa_fisica o codigo CD_MUNICIPIO_IBGE seja igual ao código CD_MUNICIPIO_IBGE da tabela compl_pessoa_fisica

8 Respostas

L

Não sou nenhum ninja em SQL, mas acho que algo assim funciona:

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
	SELECT cpf.cd_municipio_ibge
	FROM compl_pessoa_fisica cpf
	WHERE cpf.cod_pessoa_fisica = :cod
)
WHERE pf.cod = :cod

Repare que as condições dos WHERE's são a mesma.

R

Bom dia!
Obrigado, mas não está dando certo.

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
	SELECT cpf.cd_municipio_ibge
	FROM compl_pessoa_fisica cpf
	WHERE cpf.cd_pessoa_fisica = pf.cd_municipio_ibge AND cpf.ie_tipo_complemento = 1
)
WHERE cpf.cd_pessoa_fisica = pf.cd_pessoa_fisica

Na verdade eu não tenho um código, apenas vou copiar o cd_municipio_ibge de uma tabela para outra, são códigos iguais.

L

Essa parte não pode ser assim. Tenta assim:

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
	SELECT cpf.cd_municipio_ibge
	FROM compl_pessoa_fisica cpf
	WHERE cpf.cd_pessoa_fisica = pf.cd_municipio_ibge 
)
WHERE pf.cd_pessoa_fisica = :codPessoaFisica
R

Eu tinha errado mesmo, ajustei no texto acima.

Seu script ele pede para eu informar o código (:codPessoaFisica), porém eu vou copiar na verdade, são mais de 10000 mil códigos, então apenas quero copiar de um e colar no outro.

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
SELECT cpf.cd_municipio_ibge
FROM compl_pessoa_fisica cpf
WHERE cpf.cd_pessoa_fisica = pf.cd_municipio_ibge
)
WHERE pf.cd_pessoa_fisica = cpf.cd_pessoa_fisica

Erro a partir da linha : 3 no comando -
UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
SELECT cpf.cd_municipio_ibge
FROM compl_pessoa_fisica cpf
WHERE cpf.cd_pessoa_fisica = pf.cd_municipio_ibge
)
WHERE pf.cd_pessoa_fisica = cpf.cd_pessoa_fisica
Erro na Linha de Comandos : 9 Coluna : 29
Relatório de erros -
Erro de SQL: ORA-00904: “CPF”.“CD_PESSOA_FISICA”: identificador inválido
00904. 00000 - “%s: invalid identifier”
*Cause:
*Action:

L

Cara, na verdade eu estava moscando. No seu caso, tem como fazer um UPDATE FROM SELECT:

UPDATE
    pessoa_fisica pf
SET
	pf.cd_municipio_ibge = cpf.cd_municipio_ibge
FROM
    compl_pessoa_fisica cpf
WHERE
    pf.cd_pessoa_fisica = cpf.cd_pessoa_fisica

EDIT

Dei uma pesquisada e parece que o oracle não entende essa sintaxe. Vc pode tentar assim:

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
	SELECT cpf.cd_municipio_ibge
	FROM compl_pessoa_fisica cpf
	WHERE pf.cd_pessoa_fisica = cpf.cd_pessoa_fisica AND cpf.ie_tipo_complemento = 1 
);
R

Consegui :slight_smile:

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
	SELECT cpf.cd_municipio_ibge
	FROM compl_pessoa_fisica cpf
	WHERE pf.cd_pessoa_fisica = cpf.cd_pessoa_fisica AND ie_tipo_complemento = 1 
)
WHERE pf.cd_pessoa_fisica = 28027
AND 
pf.CD_MUNICIPIO_IBGE is null

Coloquei apenas um paciente como exemplo,

)
WHERE pf.cd_pessoa_fisica = cd_pessoa_fisica
AND 
pf.CD_MUNICIPIO_IBGE is null
L

Antes da sua resposta, eu tinha editado minha resposta com uma forma que executa para todos os registros. Veja se funciona.

R

Cara,
Da forma que mandou ajudou bastante, só fiz algumas alteraçòes e funcionou perfeitamente.

UPDATE pessoa_fisica pf
SET pf.cd_municipio_ibge = (
	SELECT cpf.cd_municipio_ibge
	FROM compl_pessoa_fisica cpf
	WHERE pf.cd_pessoa_fisica = cpf.cd_pessoa_fisica AND ie_tipo_complemento = 1 
)
WHERE pf.cd_pessoa_fisica = cd_pessoa_fisica
AND pf.CD_MUNICIPIO_IBGE is null
Criado 29 de julho de 2020
Ultima resposta 30 de jul. de 2020
Respostas 8
Participantes 2