Re: UPDATE COM SELECT

From: Arthur Nascimento <tureba(at)gmail(dot)com>
To: Ranier Vilela <ranier(dot)vf(at)gmail(dot)com>
Cc: Comunidade PostgreSQL Brasileira <pgsql-pt-geral(at)lists(dot)postgresql(dot)org>
Subject: Re: UPDATE COM SELECT
Date: 2021-04-01 01:46:00
Message-ID: CALVFHFbXYf2AqEC4aZ_bm5-Dio4hewMTUPqvQ7bt-4RC+VA0Kg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-pt-geral

On Wed, 31 Mar 2021 at 17:57, Ranier Vilela <ranier(dot)vf(at)gmail(dot)com> wrote:

> Alguém sabe dizer porque essa "query" não funciona, ou sabe
> de alguma maneira melhor de fazer update com select.
>
> UPDATE tbContas AS CA SET
> Debitos = (CASE WHEN ContaID = sq.ContaDebID THEN Debitos + sq.Valor ELSE
> Debitos END),
> Creditos = (CASE WHEN ContaID = sq.ContaCrdID THEN Creditos + sq.Valor
> ELSE Creditos END)
> FROM (
> SELECT L.ContaDebID,
> L.ContaCrdID,
> L.Valor
> FROM tbLancamentos AS L
> INNER JOIN tbContas AS CA1 ON CA1.ContaID = L.ContaDebID
> INNER JOIN tbContas AS CA2 ON CA2.ContaID = L.ContaCrdID
> ) AS sq
> WHERE (CA.ContaID = sq.ContaDebID OR CA.ContaID = sq.ContaCrdID)
>

O update não pode alterar mais de uma vez cada linha. E claramente não
existe razão para acreditar que teria apenas uma linha em tbLancamentos
para cada uma de tbContas.

Se quiser guardar em tbContas o _total_ de mudanças desses lançamentos,
execute um select que faça a totalização e então atualize com ela. Para
ficar mais claro em dois comandos (não testado):

with
debitos_totais as (select ContaDebID, sum(Valor) as total from
tbLancamentos group by 1)
update tbContas set Debitos = Debitos + debitos_totais.total from
debitos_totais where tbContas.ContaID = debitos_totais.ContaDebID;

with
creditos_totais as (select ContaCrdID, sum(Valor) as total from
tbLancamentos group by 1)
update tbContas set Creditos = Creditos + creditos_totais.total from
creditos_totais where tbContas.ContaID = creditos_totais.ContaCrdID;

--

Tureba - Arthur Nascimento

In response to

Browse pgsql-pt-geral by date

  From Date Subject
Next Message Flávio Granato 2021-05-07 16:03:48 (No Subject)
Previous Message Ranier Vilela 2021-03-31 23:33:36 Re: UPDATE COM SELECT