Oracle SQL - colonna di Aggiornamento dei dati utilizzando operatore MENO

0

Domanda

Ho questa query 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);

La query di cui sopra, mi riporta tutti tableX dati, che è diverso da tableY. Più tuple vengono restituiti

Prove:

Quando eseguo la query di cui sopra, ottengo questo risultato:

un b c
1 43 65
2 66 333

Quando si seleziona i dati da tableY ottengo questo:

un b c
1 54 65
2 88 567

tableY dati i dati corretti, quindi voglio aggiornare tutte le tuple restituite dalla query di prima(quello con MENO clausola) con i dati di tableY.

Il risultato atteso, dopo la clausola di aggiornamento, quando sono in grado di selezionare i dati da tableX dovrebbe essere:

un b c
1 54 65
2 88 567

Che cosa è più eficcient modo per fare questo AGGIORNAMENTO clausola?

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

Migliore risposta

1

Su oracle trovo l'UNIONE sintassi molto più usabile rispetto AGGIORNA la sintassi...

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: aggiunta la clausola where per evitare ridondante aggiornamenti, a seguito di commento qui sotto.

2021-11-23 20:50:15

Sono righe dove x.b = y.b e x.c = y.c inclusi nella transazione?
jarlh

@jarlh Aggiunto una clausola where per il WHEN MATCHED per evitare questo scenario.
MatBailie

questa soluzione ha risolto la mia domanda, grazie
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);

Per mantenere le dimensioni delle transazioni basso, aggiungere xb <> yb o 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

In altre lingue

Questa pagina è in altre lingue

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