Обсуждение: Update with join ignores where clause - updates all rows

Поиск
Список
Период
Сортировка

Update with join ignores where clause - updates all rows

От
"Brian"
Дата:
This WHERE clause finds a single row that has the same year,month,day,hour =
in another table.
It correctly counts 1 row.

SELECT count(*) FROM
       dw.prints_by_hour_work w  , dw.prints_by_hour h
WHERE
              w.year  =3D h.year
       and  w.month =3D h.month
       and  w.day   =3D h.day
       and  w.hour  =3D h.hour


The same join here, updates every row in the table which is incorrect.


update
       dw.prints_by_hour
set
       count =3D h.count + w.count
from
       dw.prints_by_hour_work w  , dw.prints_by_hour h
WHERE
              w.year  =3D h.year
       and  w.month =3D h.month
       and  w.day   =3D h.day
       and  w.hour  =3D h.hour

Is the join supported for UPDATE ?

If its supported then I can send the create statements etc so you can repro=
duce.

Re: Update with join ignores where clause - updates all rows

От
Tom Lane
Дата:
"Brian" <bengelha@comcast.net> writes:
> The same join here, updates every row in the table which is incorrect.

> update
>        dw.prints_by_hour
> set
>        count = h.count + w.count
> from
>        dw.prints_by_hour_work w  , dw.prints_by_hour h
> WHERE
>               w.year  = h.year
>        and  w.month = h.month
>        and  w.day   = h.day
>        and  w.hour  = h.hour

No, it's not a bug: it's a self-join.  If we identified the target table
with the "h" table then it would be impossible to do self-joins in
UPDATE.

You need to write

update
       dw.prints_by_hour
set
       count = dw.prints_by_hour.count + w.count
from
       dw.prints_by_hour_work w
WHERE
              w.year  = dw.prints_by_hour.year
       and  w.month = dw.prints_by_hour.month
       and  w.day   = dw.prints_by_hour.day
       and  w.hour  = dw.prints_by_hour.hour

There's been some talk of allowing an alias to be attached to the target
table ("update dw.prints_by_hour h") which would make it possible to
write the update a bit more compactly, but we haven't done that.

            regards, tom lane