[psql] problem z UPDATE'm dla nast. sytuacji
obywatel - 22-07-2006 04:33
[psql] problem z UPDATE'm dla nast. sytuacji
Witam wszystkich,
chcę zrobić następującą rzecz:
Dla przykładu są dwie tabele:
tabA: id startdateA typ
tabB: id tabAid startdateB
Potrzebuję uaktualnić (zastąpić) wartości pola startdateA w tabA odpowiadającymi im wartościami startdateB z tabB (czyli z warunkiem tabA.id = tabB.tabAid). Dodatkowy warunek dla update'a jest taki, że typ=4.
tabA ma więcej wierszy niż tabB więc nie wszystkie wiersze powinny być zaktualizowane.
Na razie nie udało mi się napisać zapytania UPDATE, które by to zrealizowało. Różnie próbowałem, np. tak:
update tabA set startdateA = tB.startdateB from tabA ta, tabB tB where tA.id = tB.tabAid and tA.type = 4;
ale ciągle mi się nie udaje.
Bardzo proszę o jakieś wskazówki.
Pozdrawiam serdecznie
herakles - 22-07-2006 04:33
obywatel wrote:
> Witam wszystkich, > > chcę zrobić następującą rzecz: > > Dla przykładu są dwie tabele: > > tabA: > id > startdateA > typ > > tabB: > id > tabAid > startdateB > > Potrzebuję uaktualnić (zastąpić) wartości pola startdateA w tabA > odpowiadającymi im wartościami startdateB z tabB (czyli z warunkiem > tabA.id = tabB.tabAid). Dodatkowy warunek dla update'a jest taki, że > typ=4. > > tabA ma więcej wierszy niż tabB więc nie wszystkie wiersze powinny być > zaktualizowane. > > Na razie nie udało mi się napisać zapytania UPDATE, które by to > zrealizowało. Różnie próbowałem, np. tak: > > update tabA set startdateA = tB.startdateB from tabA ta, tabB tB where > tA.id = tB.tabAid and tA.type = 4;
Pójdę na łatwizne: select tabAid, max(startdateb) as startdateb into temp tymczas from tabB group by tabAid;
update tabA set startdateA=tymczas.startdateb where id=tymczas.tabaid and type=4 and startdateA!=tymczas.startdateb; drop table tymczas;
teraz sobie popracuj aby nie było tabeli tymczasowej.
=?iso-8859-2?Q?Andrzej_Str=F3=BFy=F1ski?= - 22-07-2006 04:33
Użytkownik "obywatel" napisał: > Witam wszystkich, > > chcę zrobić następującą rzecz: > > Dla przykładu są dwie tabele: > > tabA: > id > startdateA > typ > > tabB: > id > tabAid > startdateB > > Potrzebuję uaktualnić (zastąpić) wartości pola startdateA w tabA > odpowiadającymi im wartościami startdateB z tabB (czyli z warunkiem > tabA.id = tabB.tabAid). Dodatkowy warunek dla update'a jest taki, że > typ=4. > > tabA ma więcej wierszy niż tabB więc nie wszystkie wiersze powinny być > zaktualizowane. > > Na razie nie udało mi się napisać zapytania UPDATE, które by to > zrealizowało. Różnie próbowałem, np. tak: > > update tabA set startdateA = tB.startdateB from tabA ta, tabB tB where > tA.id = tB.tabAid and tA.type = 4;
wypróbuj to:
update tabA set startdateA = (select startdateB from tabB x where tabA.id = x.tabAid) from tabB where tabA.id = tabB.tabAid and tabA.type = 4;
pozdrawiam A.S.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 22-07-2006 04:33
obywatel wrote: > Witam wszystkich, > > chcę zrobić następującą rzecz: > > Dla przykładu są dwie tabele: > > tabA: > id > startdateA > typ > > tabB: > id > tabAid > startdateB > > Potrzebuję uaktualnić (zastąpić) wartości pola startdateA w tabA > odpowiadającymi im wartościami startdateB z tabB (czyli z warunkiem > tabA.id = tabB.tabAid). Dodatkowy warunek dla update'a jest taki, że typ=4. > > tabA ma więcej wierszy niż tabB więc nie wszystkie wiersze powinny być > zaktualizowane. > > Na razie nie udało mi się napisać zapytania UPDATE, które by to > zrealizowało. Różnie próbowałem, np. tak: > > update tabA set startdateA = tB.startdateB from tabA ta, tabB tB where > tA.id = tB.tabAid and tA.type = 4;
Wywal tabA z FROM. Przy czym zapytanie będzie dobrze działało w przypadku relacji 1:1. Gdy masz 1:n, nie wiesz która data zostanie podstawiona jako ostatnia, a poza tym niepotrzebnie będzie się kilka razy ten sam rekord updajtował.
-- P.M.
obywatel - 22-07-2006 04:33
>> Na razie nie udało mi się napisać zapytania UPDATE, które by to >> zrealizowało. Różnie próbowałem, np. tak: >> >> update tabA set startdateA = tB.startdateB from tabA ta, tabB tB where >> tA.id = tB.tabAid and tA.type = 4; > > Wywal tabA z FROM. > Przy czym zapytanie będzie dobrze działało w przypadku relacji 1:1. Gdy > masz 1:n, nie wiesz która data zostanie podstawiona jako ostatnia, a > poza tym niepotrzebnie będzie się kilka razy ten sam rekord updajtował. >
Dzięki serdeczne WSZYSTKIM za pomysły :) Powyższe rozwiązanie jednak jak dla mnie okazało się najlepszym.
pozdrawiam
Rafał
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
mysql i mysql-front, problem
String line; if (line=="cos"){...}....problem
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
[postgres] Problem z =?ISO-8859-2?Q?zmian=B1_struktury_i_z?==?ISO-8859-2?Q?ale=BFno=B6ciami=2E?=
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ]
[PGSQL] czy ktos mial problemy z initdb pgsql 8.1 ?
[MySQL] Problem z zapisem danych w bazie danych
Problem z mysql - can't connect to MySQL/nietypowo...
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 |
|