Oracle SQL - mise à Jour de la colonne de données en utilisant MOINS d'opérateur

0

La question

J'ai cette requête 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 requête ci-dessus me renvoie tous les tableX de données, qui est différent de tableY. Plusieurs tuples sont retournés

La preuve:

Quand je lance requête ci-dessus j'obtiens ce résultat:

un b c
1 43 65
2 66 333

Lorsque je sélectionne les données de tableY j'obtiens ceci:

un b c
1 54 65
2 88 567

tableY données les données correctes, donc je veux mettre à jour tous les tuples qui sont renvoyés à partir de la première requête(l'un avec MOINS clause) avec les données de tableY.

Le résultat attendu, après la mise à jour de la clause, lorsque je sélectionne les données de tableX devrait être:

un b c
1 54 65
2 88 567

Qu'est-ce que la plupart des eficcient façon de faire de cette clause de mise à JOUR?

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

La meilleure réponse

1

Sur oracle-je trouver de la FUSION syntaxe beaucoup plus utilisable que la mise à JOUR de la syntaxe...

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: ajout de la clause where pour éviter toute redondance des mises à jour, à la suite de commentaire ci-dessous.

2021-11-23 20:50:15

Sont des lignes où x.b = y.b et x.c = y.c inclus dans la transaction?
jarlh

@jarlh Ajouté une clause where à la WHEN MATCHED pour éviter ce scénario.
MatBailie

cette solution a résolu ma question, merci
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);

Pour garder la taille de la transaction, ajouter xb <> yb ou 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

Dans d'autres langues

Cette page est dans d'autres langues

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