2015-05-08 17:53 GMT-03:00 Matheus Saraiva <[email protected]>:
> On 08/05/2015 17:21, Matheus Saraiva wrote: > > > > On 08/05/2015 17:05, Matheus de Oliveira wrote: > > > 2015-05-08 16:51 GMT-03:00 Matheus Saraiva <[email protected]>: > >> >> >> >> >> >> >> >> * UPDATE "VendasItens" SET produto_vendasitens = >> produto.produto_tipovendasitens, quantidade_vendasitens = >> produto.quantidade_tipovendasitens FROM unnest(f_produtos) AS >> produto WHERE venda_vendasitens = f_idvenda AND >> produto_vendasitens = produto.produto_tipovendasitens; * >> >> >> Ainda errado, >> Eu precisaria saber quais os produtos que compõe a venda que eu quero >> alterar, antes da alteração. Essa query está errada pois está procurando >> por combinação de produto + venda que não existe. > > > Qual atributo referencia a venda? Pela lógica do comando me parece ser > "venda_vendasitens" (por estar comparando com "f_idvenda"), mas o nome do > atributo me parece estranho. > > > Sim, venda_vendasitens referencia a venda, produto_vendasitens referencia > uma tabela de produtos. f_venda é o parâmetro passado para a função > Acho que talvez ei teria que passar para a função dois vetores, um > contendo os ids dos produtos atuais e outro contendo os ids dos novos > produtos. > > > Tentei passar dois vetores: > > * UPDATE* > * "VendasItens"* > * SET* > * produto_vendasitens = newproduto.produto_tipovendasitens, > quantidade_vendasitens = newproduto.quantidade_tipovendasitens* > * FROM* > * unnest(f_newprodutos) AS newproduto**, unnest(f_produtos)** AS > produto* > * WHERE* > * venda_vendasitens = f_idvenda AND produto_vendasitens = > produto.produto_tipovendasitens;* > > Mas também não funcionou, os vetores não são percorridos simultaneamente. > Na verdade os dois unnest fazem um cartesiano: Não sei dizer o que são os vetores, já que não informou. Mas pelo que entendi estes possuem exatamente o mesmo tamanho sendo que f_newprodutos representa novos valores para a mesma posição de f_produto (valor antigo). Sendo assim, na versão 9.4 você pode fazer a chamada do unnest passando os dois vetores: FROM unnest(f_newprodutos, f_produtos) AS p(newproduto, oldproduto) Com isso você referência as colunas como p.newproduto e p.oldproduto (e.g. p.newproduto.quantidade_tipovendasitens, p.oldproduto.produto_tipovendasitens, etc.). Em versões anteriores você pode fazer da seguinte forma: FROM (SELECT unnest(f_newprodutos) AS newproduto, unnest(f_produtos) AS oldproduto) AS p A referência é como na anterior. Mas cuidado, você deve ter certeza que o número de elementos desses vetores são idênticos, caso contrário terás surpresas indesejáveis. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
