ďťż
 
GROUP BY w UPDATE ďťż
 
GROUP BY w UPDATE
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lubiatowo.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com