update no campo com valor de outra tabela

Oracle

01/12/2010

Boa tarde!
Seguinte preciso setar o campo do valor do produto com custo dele. O preço do produto fica em uma tabela(pctabpr) e o custo esta em outra tabela(pcest). Eu fiz com um codigo de produto o seguinte sql:
update pctabpr set pctabpr.ptabela =(select pcest.custoultent from pcest where codprod=527 and codfilial =5)
where pctabpr.codprod =527 and numregiao =3

Com um produto apenas funciona, mas preciso fazer isso com todos os itens do B.D.
Desde já agradeço o help.
Marcos Souza

Marcos Souza

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

01/12/2010

As tabelas pctabpr e pcest tem somente o CodProd em comum? Os campos que não estão em comum (CodFilial e NumRegiao) tem os filtros fixos, conforme o exemplo?

Aguardo retorno.
GOSTEI 0
Marcos Souza

Marcos Souza

01/12/2010

As duas somente o codprod em comum. Na pcest o codfilial possui 9 filiais no qual quero pegar o preço de custo somente da filial 5. Na pctabpr tenho 3 numregiao no qual quero setar somente os preços do numregiao 3.
Vlw's
GOSTEI 0
Wilson Junior

Wilson Junior

01/12/2010

Veja se lhe ajuda:
UPDATE pctabpr
SET pctabpr.ptabela =(SELECT pcest.custoultent FROM pcest WHERE pcest.codprod = pctabpr.codprod AND pcest.codfilial = 5)
where pctabpr.numregiao = 3


Espero ter colaborado.
GOSTEI 0
Marcos Souza

Marcos Souza

01/12/2010

Muito obrigado, funcionou perfeitamente. Eu estava esquecendo de um parametro. Ja implementei ele e ja esta em uso.
Vlw mesmo
GOSTEI 0
Wilson Junior

Wilson Junior

01/12/2010

Precisando é só postar.
Não esqueça de finalizar o tópico.
GOSTEI 0
Marcus Honorio

Marcus Honorio

01/12/2010

Prezados boa noite, gostaria se alguém pode me auxiliar.

Estou tentando fazer o update de um campo de uma tabela, a partir de dados de uma outra. E estou utilizando a seguinte query

UPDATE CADMAT
SET CADMAT.DESCRICAO =(SELECT CADMAT5$.DESCRICAO FROM CADMAT5$ WHERE CADMAT5$.REFERENCIA = cadmat.referencia AND cadmat5$.GRUPO = cadmat.grupo)

Porém ao rodar a query, obtenho a mensagem do SQL:

Mensagem 512, Nível 16, Estado 1, Linha 1
A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, = ou quando ela é usada como uma expressão.
A instrução foi finalizada.

Os campos GRUPO e REFERENCIA são os campos chaves que distinguem meus registros nas 2 tabelas

Grato desde já pela ajuda.

Abraços
GOSTEI 0
Marcos Souza

Marcos Souza

01/12/2010

Olá, ele esta lhe informando que esta retornando mais de um resultado, por ex:
cadmat.grupo - voce esta tentando setar o grupo cadmat, porem ele nao consegue distinguir qual cadmat se existe mais de um. Se tiver 1,2,3,4 ele nao consegue separar.
O mesmo serve para referencia. Um dos dois ou os dois estao retornando valores identicos, sendo que ele consegue setar apenas um. Da um select na tabela para ver se existe essas informações duplicadas, pois tive o mesmo problema que voce em um update e tive que retirar os valores duplicados para setar.
Abç
GOSTEI 0
Marcus Honorio

Marcus Honorio

01/12/2010

Bom deixa ver se eu entendi. Eu tenho referencias identicas e o que distinguem uma das outras é o grupo, exemplo:

GRUPO REFERENCIA
01 001235
02 001235
01 000347
04 000347
03 000213
VL 000213

Por isso a minha condição em dizer que where cadmat.grupo = cadmat5$.grupo AND cadmat.referencia = cadmat5$.referencia

Voce está me dizendo que em uma das 2 tabelas há uma duplicidade do tipo:

GRUPO REFERENCIA
01 001235
01 001235

??????????


Abraços e obrigado
GOSTEI 0
Marcos Souza

Marcos Souza

01/12/2010

Exatamente, ele nao esta conseguindo distinguir o que setar na sua tabela, pois existe esses codigos repetidos, pois esta retornando dois ou mais resultados.
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

01/12/2010

Tente algo do tipo

UPDATE CADMAT
SET CADMAT.DESCRICAO =(SELECT DISTINCT CADMAT5$.DESCRICAO FROM CADMAT5$ WHERE CADMAT5$.REFERENCIA = cadmat.referencia AND cadmat5$.GRUPO = cadmat.grupo)

Ou ainda

UPDATE CADMAT
SET CADMAT.DESCRICAO =(SELECT TOP 1 CADMAT5$.DESCRICAO FROM CADMAT5$ WHERE CADMAT5$.REFERENCIA = cadmat.referencia AND cadmat5$.GRUPO = cadmat.grupo)
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

01/12/2010

Tente algo do tipo

UPDATE CADMAT
SET CADMAT.DESCRICAO =(SELECT DISTINCT CADMAT5$.DESCRICAO FROM CADMAT5$ WHERE CADMAT5$.REFERENCIA = cadmat.referencia AND cadmat5$.GRUPO = cadmat.grupo)

Ou ainda

UPDATE CADMAT
SET CADMAT.DESCRICAO =(SELECT TOP 1 CADMAT5$.DESCRICAO FROM CADMAT5$ WHERE CADMAT5$.REFERENCIA = cadmat.referencia AND cadmat5$.GRUPO = cadmat.grupo)


Vale lembrar que a melhor alternativa é utilizar JOIN
GOSTEI 0
Marcus Honorio

Marcus Honorio

01/12/2010

Prezados, muito obrigado pela ajuda.

Eu rodei a query

SELECT DISTINCT grupo, referencia
FROM CADMAT
GROUP BY REFERENCIA, GRUPO
HAVING count(REFERENCIA) > 1

E vi que existiam 2 registros identicos.

Depois apliquei o update sugerido por voces.

Obrigado a todos pela ajuda.

Abraços
GOSTEI 0
POSTAR