Oracle SQL - Update coloană de date folosind operatorul MINUS

0

Problema

Am această interogare 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);

Interogarea de mai sus revine mine toate tableX de date, care este diferit de tableY. Mai multe tupluri sunt returnate

Dovezi:

Atunci când am rula mai sus interogare am obține acest rezultat:

o b c
1 43 65
2 66 333

Când am selectați datele din tableY primesc asta:

o b c
1 54 65
2 88 567

tableY datele sunt datele corecte, așa că vreau să actualizați toate tuplurile care sunt returnate de prima interogare(cea cu MINUS clauza) cu datele din tableY.

Rezultatul așteptat, după actualizarea clauzei, când am selectați datele din tableX ar trebui să fie:

o b c
1 54 65
2 88 567

Ceea ce este cel mai eficcient mod de a face acest UPDATE clauza?

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

Cel mai bun răspuns

1

Pe oracle găsesc MERGE sintaxă mult mai ușor de utilizat decât ACTUALIZARE sintaxa...

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: adăugat o clauză where pentru a evita redundanta actualizări, următorul comentariu de mai jos.

2021-11-23 20:50:15

Sunt rânduri unde x.b = y.b și x.c = y.c incluse în tranzacție?
jarlh

@jarlh a Adăugat o clauză where a WHEN MATCHED pentru a evita acest scenariu.
MatBailie

această soluție a rezolvat întrebarea mea, multumesc
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);

Pentru a păstra dimensiunea tranzacției în jos, se adaugă xb <> yb sau 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

În alte limbi

Această pagină este în alte limbi

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