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

Responder a