ďťż
 
[Oracle] Jak opymalnie update'owac tabele danymi z innej tabeli ďťż
 
[Oracle] Jak opymalnie update'owac tabele danymi z innej tabeli
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

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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com