[Oracle] Jak opymalnie update'owac tabele danymi z innej tabeli
HuKawa - 11-11-2006 00:54
[Oracle] Jak opymalnie update'owac tabele danymi z innej tabeli
Pomocy - niedawno przesiadłem się z MS-SQLa na Oracla i często mam poważne problemy z nawet najprostszymi zapytaniam. Wyczytałem ile dałem radę ale niektóre rzeczy wydają mi się nadwyraz utrudnione - mam prosty temat który IMHO powinien się dacznacznie optymalniej rozwiązać.
Mam 2 tabele: Tab_A (A_id, A1, A2, A3, A4, A5 ...itd) i Tab_B (B_id, B1, B2, B3, B4, B5 ...itd)
Potrzebuję w jednej zmodyfikować NIEKTÓRE pola wyliczone na podstawie pól z drugiej w odpowiadających im (wg. id ) rekordach.
w MS-SQL trwało by to ułamki sekund, a wyglądałoby to tak:
update Tab_A set A1 = B1, A2 = 2 * B2, A3 = 'Wynik: ' + B3 from Tab_B where A_id = B_id
Oczywiście taka składnia na Oraclu nie zadziała, więc piszę to mniej więcej tak:
update Tab_A set A1 = (select B1 from Tab_B where B_id = A_id ), A2 = (select 2 * B2 from Tab_B where B_id = A_id ), A3 = (select 'Wynik: ' || B2 from Tab_B where B_id = A_id ) from Tab_B where A_id in (select B_id from Tab_B)
Już na pierwszy rzut oka widać że to jest potwornie nieoptymalne (musi selectować wielokrotnie z tych samych tabel zamiast je poprostu skleić). Działa stosunkowo znośnie jak na tak okrężną formę ale potrzebuję jakiegoś szybszego rozwiązania.
Czy można to zrobić jakoś inaczej?
Pozdroofki ----------- HuKawa
HuKawa - 11-11-2006 00:54
Napisałem:
> update Tab_A set > A1 = (select B1 from Tab_B where B_id = A_id ), > A2 = (select 2 * B2 from Tab_B where B_id = A_id ), > A3 = (select 'Wynik: ' || B2 from Tab_B where B_id = A_id ) > from Tab_B > where > A_id in (select B_id from Tab_B)
Oczywiście miało być bez tego from'a :o)
update Tab_A set A1 = (select B1 from Tab_B where B_id = A_id ), A2 = (select 2 * B2 from Tab_B where B_id = A_id ), A3 = (select 'Wynik: ' || B2 from Tab_B where B_id = A_id ) where A_id in (select B_id from Tab_B)
Sorki i pozdr ----------- HuKawa
Michał Kuratczyk - 11-11-2006 00:54
HuKawa wrote: > w MS-SQL trwało by to ułamki sekund, a wyglądałoby to tak: > > update Tab_A set > A1 = B1, > A2 = 2 * B2, > A3 = 'Wynik: ' + B3 > from Tab_B > where > A_id = B_id
MERGE INTO Tab_A a USING Tab_B b ON ( a.a_id = b.b_id ) WHEN MATCHED THEN UPDATE SET a.A1 - b.B1, a.A2 = 2 * b.B2, a.A3 = 'Wynik: ' + b.B3 WHEN NOT MATCHED THEN INSERT ...
Część WHEN NOT MATCHED jest w tej sytuacji nadmiarowa (Twój UPDATE tego nie robi), ale zazwyczaj jest ona przydatna.
-- Michał Kuratczyk
HuKawa - 11-11-2006 00:54
Michał Kuratczyk napisał:
> MERGE INTO Tab_A a > USING Tab_B b > ON ( a.a_id = b.b_id ) > WHEN MATCHED THEN UPDATE > SET a.A1 - b.B1, > a.A2 = 2 * b.B2, > a.A3 = 'Wynik: ' + b.B3 > WHEN NOT MATCHED THEN INSERT ...
Boooooosko :o) Właśnie o to chozdziło... W życiu bym nie zgadł że jest takie coś i że się nazywa MERGE :o)
Dzięki wielkie... niech Ci Bozia wynagrodzi w ... czym sobie życzysz. ----------- HuKawa
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
[Oracle] =?ISO-8859-2?Q?=A3=B1czenie_wierszy_z_zapytania_?==?ISO-8859-2?Q?w_jeden_string?=
=?iso-8859-2?q?[oracle_10g]_jak_da=E6_grant_do_gv$=2E=2E=2E=2E_=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plnatalia97.htw.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 |
|