GROUP BY w UPDATE
eZo - 08-04-2006 00:04
GROUP BY w UPDATE
Witam, Baza PostgreSQL 7.4
Tabela a: tid | ilosc --------------- 1 | 33 2 | 12 3 | 2
Tabela b:
tid | przyrost ------------------ 1 | 5 3 | 12 3 | 7
Potrzebuje uaktualnic kolumne <ilosc> w tabeli "a" o wartosc z kolumny <przyrost> w tabeli "b" co normalnie mozna zrobic poprzez:
UPDATE a SET ilosc = ilosc + b.przyrost FROM b WHERE b.tid = a.tid
Jednak jak mozna zauwazyc w tabeli "b" moga pojawiac sie krotki z tymi samymi wartosciami kolumny <tid>, dlatego tabele "a" chcialem uaktualniac o sume wartosci przyrostu z tabeli "b" piszac:
UPDATE a SET ilosc = ilosc + sum(b.przyrost) FROM b WHERE b.tid = a.tid
Na co jednak Pg zwraca standardowy komunikat ze <ilosc> musi byc rowniez w funkcji agregujacej badz uzyta w GROUP BY. (co w tym wypadku mnie nieco dziwi) Niestety nie wydaje mi sie zeby skladnia UPDATE pozwalala na uzycie grupowania. Czy da sie cos takiego zrealizowac w jednym UPDATE, czy tez lepiej sprobowac zapewnic unikalnosc <tid> w tabeli "b" (co niestety bedzie problematyczne)?
Pozdrawiam -- Tomasz Kuźniar <mezon@mezon.eu.org> _Cały_ świat jest robiony nogami.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 08-04-2006 00:04
Użytkownik eZo napisał: > > UPDATE a SET ilosc = ilosc + b.przyrost FROM > b WHERE b.tid = a.tid > > Jednak jak mozna zauwazyc w tabeli "b" moga pojawiac sie krotki z tymi samymi > wartosciami kolumny <tid>, dlatego tabele "a" chcialem uaktualniac o sume > wartosci przyrostu z tabeli "b" piszac: > > UPDATE a SET ilosc = ilosc + sum(b.przyrost) FROM > b WHERE b.tid = a.tid > > Na co jednak Pg zwraca standardowy komunikat ze <ilosc> musi byc rowniez w > funkcji agregujacej badz uzyta w GROUP BY. (co w tym wypadku mnie nieco dziwi) > Niestety nie wydaje mi sie zeby skladnia UPDATE pozwalala na uzycie grupowania. > Czy da sie cos takiego zrealizowac w jednym UPDATE, czy tez lepiej sprobowac > zapewnic unikalnosc <tid> w tabeli "b" (co niestety bedzie problematyczne)?
Użyj podzapytania.
-- P.M.
Noel - 08-04-2006 00:04
Użytkownik eZo napisał:
> wartosci przyrostu z tabeli "b" piszac: > > UPDATE a SET ilosc = ilosc + sum(b.przyrost) FROM > b WHERE b.tid = a.tid >
UPDATE a SET a.ilosc = a.ilosc + ( SELECT sum(b.przyrost) FROM b WHERE b.tid = a.tid );
-- Tomek "Noel" B.
eZo - 08-04-2006 00:04
Dnia Fri, 07 Apr 2006 16:51:59 +0200, Pan(i) Noel <tbal@go2.pll-l> popełnił(a): > > UPDATE a > SET a.ilosc = a.ilosc + > ( > SELECT sum(b.przyrost) > FROM b > WHERE b.tid = a.tid > );
Dzieki, po malych optymalizacjach dziala bez zarzutu.
-- Tomasz Kuźniar <mezon@mezon.eu.org> _Cały_ świat jest robiony nogami.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
Która z baz: [PGSQL] czy [MySQL] będzie lepsza w takim zastosowaniu (masowe UPDATE)
MSSQL - =?iso-8859-2?Q?kolejno=B6=E6?= przetwarzania przy UPDATE
=?ISO-8859-2?Q?[MSSQL_2005_+.NET]_Dramatycznie_d=B3ugi_Update_bazy_....?=
=?iso-8859-2?Q?=5Bmssql=5D_update_na_kilku_tabelach_jednocze= B6nie?=
=?ISO-8859-2?Q?[MS_SQL]_update_wielu_p=F3l_na_raz_z_selecta?=
=?iso-8859-2?Q?=5Bpgsql=5D_update_podw=F3jnego_z=B3=B1czenia? =
[Oracle] Jak opymalnie update'owac tabele danymi z innej tabeli
[MYSQL] Update if =?ISO-8859-2?Q?kom=F3rka_is_null?=
[db2] Update sql posiłkowany danymi z innej tabeli
zanotowane.pldoc.pisz.plpdf.pisz.pllubiatowo.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|