[MySQL] Skopiowanie =?ISO-8859-2?Q?warto=B6ci_z_jednego_po?==?ISO-8859-2?Q?la_do_drugiego_w_jednej_tabeli=2C_r=F3=BFne_?= =?ISO-8859-2?Q?wiersze=2E?=
sawic - 14-12-2006 16:09
[MySQL] Skopiowanie =?ISO-8859-2?Q?warto=B6ci_z_jednego_po?==?ISO-8859-2?Q?la_do_drugiego_w_jednej_tabeli=2C_r=F3=BFne_?= =?ISO-8859-2?Q?wiersze=2E?=
Witam. Mam tak? tabel?:
user (char (20)) | wartosc (int (5)) | nowy (int(1)) ---------------------------------------------------- user1 | 25 | 0 user2 | 13 | 0 user3 | 233 | 0 user1 | NULL | 1 user3 | NULL | 1
Czy da si? za pomoc? jednego zapytania skopiowa? pole wartosc odpowiednio dla ka?dego u?ytkownika z wiersza gdzie nowy = '0' do wiersza gdzie nowy = '1' ? Czyli po owym zapytaniu stan tabeli powinien wygl?da?:
user (char (20)) | wartosc (int (5)) | nowy (int(1)) ---------------------------------------------------- user1 | 25 | 0 user2 | 13 | 0 user3 | 233 | 0 user1 | 25 | 1 user3 | 233 | 1
Próbowa?em takich zapyta?:
- update db.table set wartosc = wartosc where db.table.user = db.table.user and nowy = '1'
- update db.table set wartosc = (select wartosc from db.table where nowy = '0' and db.table.user = db.table.user) where nowy = '1'
Niestety nie by?o to dobre rozumowanie.
Czy da si? w ogóle co? takiego wykona? ?
Pozdrawiam
Artur - 14-12-2006 16:09
=?iso-8859-2?q?Re:_Skopiowanie_warto=B6ci_z_jednego_pola_do_d rugiego_w_jednej_tabeli,_r=F3=BFne?=
> Czy da si? w ogóle co? takiego wykona? ?
Da si?, np:
update tab1 z set (z.wartosc) = (select w.wartosc from tab1 w where w.nowy = 0 and w.uzytk = z.uzytk) where z.nowy = 1
-- Artur Wro?ski
sawic - 14-12-2006 16:09
Artur napisa?(a): > Da si?, np: > > update tab1 z > set (z.wartosc) = > (select w.wartosc > from tab1 w > where w.nowy = 0 and w.uzytk = z.uzytk) > where z.nowy = 1
Nie dzia?a?.
Zapytanie: update db.test z set z.wartosc = (select w.wartosc from db.test w where w.nowy = 0 and w.user = z.user) where z.nowy = 1
B??d: #1093 - You can't specify target table 'z' for update in FROM clause
Pozdrawiam
Artur - 14-12-2006 16:10
=?iso-8859-2?q?Re:_Skopiowanie_warto=B6ci_z_jednego_pola_do_d rugiego_w_jednej_tabeli,_r=F3=BFne?=
> > update tab1 z > > set (z.wartosc) = > > (select w.wartosc > > from tab1 w > > where w.nowy = 0 and w.uzytk = z.uzytk) > > where z.nowy = 1 > > B??d: > #1093 - You can't specify target table 'z' for update in FROM clause
Pewnie znów ogranicznie MySQL-a.
Mo?esz jeszcze spróbowa? takiej konstrukcji (b?dzie dzia?a? na DB2), zobacz czy dzia?a w MySQL:
update ( select z.wartosc as wartosc, (select w.wartosc from tab1 w where w.uzytk=z.uzytk and w.nowy = 0) as nowy from tab1 z where z.nowy = 1 ) set wartosc = nowy
zapytanie ze ?rodka (pierwszy select) wyszukuje te rekordy, które powinny by? aktualizowane (nowy = 1), podaj?c w jednej linii star? i now? warto??:
WARTOSC NOWY - 25 - 233
Rokordy s? spozycjonowane niewidocznym kursorem, wie? nie b?dziesz musia? u?ywa? innych pól do ich identyfikacji.
update po prostu przepisuje now? warto??. Oto rezultat:
UZYTK WARTOSC NOWY -------------------- ----------- ----------- user2 13 0 user1 25 0 user1 25 1 user3 233 0 user3 233 1
-- Artur Wro?ski
Maciek Dobrzanski - 14-12-2006 16:10
"sawic" <sawicc@wytnij.to.gmail.com> wrote in message news:ela4a3$230$1@news.onet.pl...
> Czy da si? za pomoc? jednego zapytania skopiowa? pole wartosc odpowiednio > dla ka?dego u?ytkownika z wiersza gdzie nowy = '0' do wiersza gdzie nowy = > '1' ?
Mo?e by? tak:
UPDATE tabela t1, tabela t2 SET t1.wartosc = t2.wartosc WHERE t1.user = t2.user AND t1.nowy = 1 AND t2.nowy = 0;
Maciek
sawic - 14-12-2006 16:10
Artur napisa?(a): > Mo?esz jeszcze spróbowa? takiej konstrukcji (b?dzie dzia?a? na > DB2), zobacz czy dzia?a w MySQL: > > update ( > select z.wartosc as wartosc, > (select w.wartosc from tab1 w where w.uzytk=z.uzytk and w.nowy = 0) > as nowy > from tab1 z > where z.nowy = 1 > ) > set wartosc = nowy
Niestety te? nie dzia?a. B??d:
#1248 - Every derived table must have its own alias
Nie dr??y?em dalej, bo przyk?ad jaki poda? Maciek w po?cie ni?ej dzia?a jak nale?y.
Wielkie dzi?ki za pomoc.
Pozdrawiam
sawic - 14-12-2006 16:10
Maciek Dobrzanski napisa?(a): > Mo?e by? tak: > > UPDATE tabela t1, tabela t2 SET t1.wartosc = t2.wartosc WHERE t1.user = > t2.user AND t1.nowy = 1 AND t2.nowy = 0;
Dzia?a. Dzi?ki.
Pozdrawiam
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Gdzie MySQL 4.1, a gdzie 5.0?
[MS SQL] "set names" (mySQL) w MS SQL
oracle -> oracle lub oracle -> mysql replikacja - programy
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
[MySQL] Zwrot tego, co pasuje i nie pasuje :-/
[pgsql] Dostosowanie składni MySQL 5.0 -> PGSQL 8.1
[mysql] galeria zdjec - numerowanie zdjec
[MySQL] Zapytanie z pliku , wynik do pliku
[mysql] CONCAT agregujący, ale nie GROUP_CONCAT()
mysql data 0000-00-00 na koniec
zanotowane.pldoc.pisz.plpdf.pisz.pladwokat.keep.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 |
|