2014-07-01 4 views
0

J'ai un problème de conception lors de la création d'une procédure. Supposons que je doive mettre à jour toutes les lignes d'une table en utilisant les données des autres colonnes de la même ligne.Mise à jour via la fusion

Dites table1 a 3 colonnes A, B et C et j'ai besoin de mettre à jour toutes les lignes comme C=A+B. Je peux donc utiliser:

update table1 set C=A+B; 

Mais je dois le faire en utilisant quelque chose comme ci-dessous:

merge tab1e1 using (some query) on (some condition) 
when matched update 
C=A+B 
when not matched 
null; 

Est-il possible de le faire en manipulant « une requête » et « une condition »?

+0

Pourquoi cela serait-il un problème? Vous pouvez simplement faire 'update set c = a + b' dans la clause' when matched'. En faire une fusion restreindra les lignes que vous mettez à jour - vous seul savez ce que 'une requête' et une certaine 'condition' doivent être, et pourquoi vous devez utiliser la fusion du tout? Je ne comprends pas quelle est votre véritable question ou ce sur quoi vous êtes bloqué. Un exemple concret pourrait aider, c'est plutôt vague. –

+0

Ou voulez-vous dire que vous voulez toujours mettre à jour chaque ligne de la table; mais que vous voulez faire cela via une fusion de toute façon? Tellement que «quand correspond» est toujours vrai? Si oui, pourquoi? –

+0

Merci pour la réponse rapide .. en fait je dois faire par fusion de toute façon. C'est une version super simplifiée d'une requête créée en cours d'exécution. C'est un scénario où la déclaration de fusion sera mise à jour toutes les lignes d'une table en utilisant des colonnes de lui-même – kamal

Répondre

1

Je ne comprends pas vraiment pourquoi vous voulez utiliser une fusion au lieu d'une mise à jour, mais si vous avez vraiment, vous pouvez utiliser dual pour créer votre clause using et une condition on qui est toujours vrai:

merge into table1 
using (select null from dual) 
on (1 = 1) 
when matched then update set c = a + b; 

avec des données de l'échantillon:

create table table1 (a number, b number, c number); 
insert into table1 values (1, 2, null); 
insert into table1 values (3, 4, null); 
insert into table1 values (5, 6, null); 

merge into table1 
using (select null from dual) 
on (1 = 1) 
when matched then update set c = a + b; 

3 rows merged. 

select * from table1; 

     A   B   C 
---------- ---------- ---------- 
     1   2   3 
     3   4   7 
     5   6   11 

SQL Fiddle.

+0

Merci Alex pour votre temps .. c'était une contrainte de conception. C'est pourquoi j'avais besoin de faire cette mise à jour de manière 'fusionner' – kamal

Questions connexes