2012-07-02 2 views
1

Possible en double:
Oracle: how to UPSERT (update or insert into a table?)mise à jour ou d'insertion en fonction de la valeur d'une colonne dans la table

Pourriez-vous les gars me donner une idée sur la façon de procéder dans la situation ci-dessous:

Read table 2 column 1 
if value says the record exists in table 1 
update table 1 record with table 2 record details 
else(value says the record does not exist in table 1) 
insert table 1 record with table 2 record details 

Je suis débutant à Oracle SQL, S'il vous plaît laissez-moi savoir s'il y a une meilleure approche .. Je pensait à utiliser des curseurs pour résoudre ce problème.

+0

Pouvez-vous expliquer un peu plus? Pourquoi ne pouvez-vous pas vérifier par rapport au tableau 1? – Matthew

Répondre

6

La réponse la plus simple est d'utiliser la déclaration merge:

MERGE INTO table1 a 
USING (select column1, column2 
      from table2) b 
ON (a.column1 = b.column1) 
WHEN MATCHED THEN 
    update set a.column2 = b.column2 
WHEN NOT MATCHED THEN 
    insert (a.column1, a.column2) 
    values (b.column1, b.column2) 

Il suffit de mettre cela prend tout de la select sur table2. Il joint ensuite cette requête à table1 à la condition. S'il y a un "match", alors il met à jour, sinon insère.

Le documentation has more information sur les diverses options supplémentaires dont vous n'avez pas besoin actuellement.

+0

Merci Ben, il a presque servi le but ... la première fois il a fonctionné avec succès mais si je cours encore il jette l'erreur "incapable d'obtenir un ensemble stable de rangées dans les tables sources" aucun travail pour cela..tried avec Distinct comme mentionné dans l'un des autres fils mais cela n'a pas fonctionné. – javanoob

+0

Attention, il y avait de nombreux bugs concernant cette fonctionnalité dans Oracle9. Nous avons même été interdit de l'utiliser jusqu'à la mise à niveau vers oracle10. – ipip

+0

@javanoob, il semble que vous n'ayez pas un ensemble de lignes unique après la première exécution, c'est-à-dire que vous n'avez pas de contrainte/index unique sur la table. Les colonnes auxquelles vous vous joignez sont-elles uniques? Vous les avez exécutées une fois? – Ben

Questions connexes