Oracle SQL - Aktualizácia stĺpec údajov pomocou MÍNUS operátora

0

Otázka

Ja som tento sql dopyt

(select x.a, x.b, x.c, x.d
from tableX x
where x.a IS NOT NULL
minus 
select y.a, y.b, y.c, y.d
from tableY y);

Vyššie dotaz vráti mi všetky tableX údajov, ktoré je odlišné od tableY. Viac tíc

Dôkaz:

Keď som spustiť vyššie dotaz som dostať tento výsledok:

a b c
1 43 65
2 66 333

Keď som sa vybrať údaje z tableY som si toto:

a b c
1 54 65
2 88 567

tableY údaje sú správne údaje, tak som sa chcete aktualizovať všetky tice, ktoré sa vrátili od prvého dotazu(jeden s MÍNUS doložky) s údajmi z tableY.

Očakávaným výsledkom, po aktualizovať doložku, keď som sa vybrať údaje z tableX by mali byť:

a b c
1 54 65
2 88 567

Čo je najviac eficcient spôsob, ako to urobiť AKTUALIZOVAŤ doložku?

oracle plsql sql
2021-11-23 19:18:31
2

Najlepšiu odpoveď

1

Na oracle som nájsť ZLÚČIŤ syntax oveľa viac použiteľné ako AKTUALIZOVAŤ syntax...

MERGE INTO
  tablex   x
USING
  tabley   y
    ON (y.a = x.a)
WHEN MATCHED THEN UPDATE
  SET
    x.b = y.b,
    x.c = y.c
  WHERE
    LNNVL(x.b = y.b)
    OR
    LNNVL(x.c = y.c)

Edit: pridané kde klauzula, aby sa zabránilo zbytočným aktualizácie, nasledujúce komentár nižšie.

2021-11-23 20:50:15

Sú riadky, kde x.b = y.b a x.c = y.c zahrnuté v transakcii?
jarlh

@jarlh Pridali kde ustanovenia WHEN MATCHED aby sa zabránilo, že scenár.
MatBailie

toto riešenie vyriešiť moju otázku, ďakujem
jct
0
update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley where tabley.a = tablex.a);

Aby transakcie veľkosť dole, pridať xb <> yb alebo xc <> yc:

update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley
              where tabley.a = tablex.a
                and (LNNVL(tabley.b = tablex.b) or LNNVL(tabley.c = tablex.c)));
2021-11-23 20:39:46

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................