Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wosh1ngton

Update que retorna múltiplas linhas

Recommended Posts

Tenho uma tabela produto que contém o campo derivado ultimo_preco_compra, tenho uma tabela item_compra que contém o preco de compra de determinado produto, preciso criar um update que atualize o valor de produto.ultimo_preco_compra de acordo com o valor desse produto na tabela item_compra, lembrando que o um produto x pode conter vários valores de compra no decorrer de um determinado período pois pode subir ou diminuir de preço.

Fiz a seguinte query:

 

UPDATE produto p SET p.ultimo_preco_compra=(SELECT ic.preco FROM item_compra ic) WHERE p.cod_produto IN
(SELECT ic.preco FROM item_compra ic WHERE ic.data_entrega_item IN
(SELECT max(data_entrega_item) FROM item_compra GROUP BY cod_produto));
teoricamente sem a parte em vermelho eu teria o resultado desejado, contudo, a consulta retorna múltiplas linhas o que não é permitido pelo operador '=', tentei utilizar o operador IN mas o retorno não é o desejado retornando vazio.
Alguém pode ajudar?

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se isto funciona pois o UPDATE depende de um subselect com a referência da própria tabela.

 

Eu faria um Cursor com For e o Update dentro do For.

 

Tentaria também melhorar este select (são dois subslects).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hummmm, não sei trabalhar com cursores.

A consulta em si funciona, mas não retorna o que preciso.

Será que poderia explicar melhor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a consulta funciona retorna o esperado.

 

Pelo que entendi se quer atualizar a ultima data de compra por produto.

 

Vejo duas soluções

 

1 uma trigger em item_compra atualiza esta coluna em produto

 

 

Ou

 

 

2 monte uma query que agrupe a ultima data de compra por produto, para cada linha desta query num cursor atualize a ultima data em produto, monte uma stored procedure com esta lógica e execute sempre que necessário

 

 

Grosso modo creio que seria isto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quero atualizar o último preço de compra na tabela produto,

para saber o último valor de produto na tabela item_compra uso um select que captura

a data mais recente que o produto foi comprado agrupado por produto.

Pelo que você disse essa consulta não é algo tão trivial, não sei nada de triggers e cursores,

vou ver o que consigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente simplificar a query, ela é a base para a solução


Select produto,preco
From item i1
Where data = (select max(data)
From item i2
Where i2.produto = i1.produto)



Creio ser +ou- isto.

Editado num tablet, desculpa qq coisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

a trigger seria lgo assim

CREATE OR REPLACE
TRIGGER TRG_ITEM
BEFORE INSERT OR UPDATE
ON ITEM_COMPRA
REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
 --
begin
  update PRODUTO
  set    ULTIMO_PRECO_COMPRA=:new.PRECO
  where  COD_PRODUTO = ;new.COD_PRODUTO
  and    ULTIMO_PRECO_COMPRA<>:new.PRECO ;
END;

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criei a trigger como você orientou

 

CREATE OR REPLACE TRIGGER TRIGGER_PRECO
BEFORE INSERT OR UPDATE
ON ITEM_COMPRA
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
update PRODUTO
set ULTIMO_PRECO_COMPRA=:new.PRECO
where cod_produto=:new.COD_PRODUTO
and ultimo_preco_compra<>:new.PRECO;
END;
Agora sempre que faço a inserção de um valor na tabela item_compra, automaticamente o campo ultimo_preco_compra da tabela produto é preenchido, o que atende a demanda. Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.