Re: update set from where... with count

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: update set from where... with count
Дата
Msg-id 2323.999790601@sss.pgh.pa.us
обсуждение исходный текст
Ответ на update set from where... with count  ("Jason Donald" <jason@sitepoint.com>)
Список pgsql-general
"Jason Donald" <jason@sitepoint.com> writes:
> UPDATE
>  summary
> SET
>  hits = s.hits + 1
> FROM
>  summary AS s,
>  items   AS i
> WHERE
>  s.recdate = i.recdate  AND
>  s.item    = i.item;

This is almost certainly *not* what you want to do.  What the above
query requests is a three-way join between the target table (summary),
summary AS s, and items AS i.  Since there isn't any constraint on
the target table, what will effectively happen is that every row in
summary gets incremented --- and would get incremented more than once,
were it not for some rather arcane visibility rules that prevent a
given target row from being updated more than once in a single UPDATE.
In any case, the update is being driven off the value of hits from the
first s row, which might not have anything to do with the current target
row.

I think what you really need here is a sub-select, on the order of

UPDATE summary
SET hits = hits + (SELECT count(*) FROM items as i
                   WHERE summary.recdate = i.recdate AND
                         summary.item = i.item);

            regards, tom lane

В списке pgsql-general по дате отправления:

Предыдущее
От: Nico
Дата:
Сообщение: Re: getting inherited table name
Следующее
От: "Jeff Eckermann"
Дата:
Сообщение: Re: template0 and template1 databases