Oracle SQL - Aktualizacja danych kolumny z pomocą operatora MINUS

0

Pytanie

Mam ten zapytanie sql

(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);

Powyższe zapytanie zwraca mi wszystkie dane Tabelax, które różnią się od tableY. Wraca kilka krotek

Dowody:

Kiedy wykonuję dany wniosek, otrzymuję wynik ten:

a b c
1 43 65
2 66 333

Gdy wybieram dane z tabeli, dostaję to:

a b c
1 54 65
2 88 567

Dane w tabeli są poprawnymi danymi, dlatego chcę zaktualizować wszystkie кортежи zwrócone z pierwszego zapytania(z ofertą MINUS), danymi z tabeli.

Oczekiwany wynik po oferty update, gdy wybieram dane z Tabelax, musi być:

a b c
1 54 65
2 88 567

Jaki jest najbardziej skuteczny sposób, aby wykonać to zdanie o AKTUALIZACJI?

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

Najlepsza odpowiedź

1

W oracle uważam, że składnia SCALANIA o wiele bardziej komfortowe, niż składnia AKTUALIZACJI...

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)

Zmiany: dodano klauzulę where, aby uniknąć zbędnych aktualizacji, zgodnie z komentarza poniżej.

2021-11-23 20:50:15

Czy są jakieś wiersze, w których x.b = y.b i x.c = y.c, w transakcję?
jarlh

@jarlh Dodał klauzula where WHEN MATCHED aby uniknąć tego scenariusza.
MatBailie

to rozwiązanie zdecydowało się moje pytanie, dziękuję
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 zmniejszyć rozmiar transakcji, dodaj xb <> yb lub 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

W innych językach

Ta strona jest w innych językach

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