La fonction Merge sous Oracle

Introduction

Oracle_logo

L’instruction « Merge », apparue dans la version 9i d’Oracle, permet de fusionner deux tables.

Relativement méconnue, elle permet pourtant de simplifier et optimiser les traitement de type :

  • Mise à jour d’une table à partir d’une jointure avec une autre
  • ou même : si enregistrement existe alors « mise à jour », sinon « insertion »

Syntaxe

Pour mettre à jour la table « a » à partir d'une jointure avec une table « b », la syntaxe est la suivante :

MERGE INTO [TABLE_A_METTRE_A_JOUR] a
    USING [TABLE2] b
    ON (a.[CHAMPID] = b.[CHAMPID])
  WHEN MATCHED THEN
    UPDATE SET a.[CHAMP] = b.[CHAMP]
  WHEN NOT MATCHED THEN
    INSERT ([CHAMP_A1], [CHAMP_A2])  VALUES (b.[CHAMP_B1], b. [CHAMP_B2]);

A partir de la version 10g d’Oracle, la partie « WHEN NOT MATCHED » devient facultative et peut être ignorée, si l’on souhaite se limiter à la mise à jour par exemple.

 

Illustration par un exemple

Imaginons une table contenant une liste d’articles, leur prix, et des informations complémentaires (note, avis…) :

Table ARTICLES :

CODE DESIGNATION PRIX NOTE AVIS
1001 Tablette tactile 7’ 100 6/10 Manque d’autonomie
1002 Téléphone portable 4’ 160 7/10 Bon
1003 Ordinateur portable 500 6.5/10 Idéal pour la bureautique
1004 Clé USB 15 9 Grande capacité

Nous souhaitons mettre à jour cette table avec les tarifs et nouveautés 2016 :

  • Le prix du téléphone passe à 120€
  • Le prix de l’ordinateur portable passe à 490€
  • Un nouvel article est disponible : la montre connectée à 300€

Table NOUVEAUTES :

CODE2016 DESIGNATION2016 PRIX2016
1002 Téléphone portable 4’ 120
1003 Ordinateur portable 490
1005 Montre connectée 300

Pour mettre à jour la table "ARTICLES" à partir des nouveaux prix de la table "NOUVEAUTES", la requête de mise à jour à appliquer est la suivante :

MERGE INTO ARTICLES a
    USING NOUVEAUTES n
    ON (a.CODE = n.CODE2016)
  WHEN MATCHED THEN
    UPDATE SET a.PRIX = n.PRIX2016
  WHEN NOT MATCHED THEN
    INSERT (CODE, DESIGNATION, PRIX)  VALUES (n.CODE2016, n.DESIGNATION2016, n.PRIX2016);

La jointure est faite sur le champ CODE de la table ARTICLES, et le champ CODE2016 de la table NOUVEAUTES.

  • Quand la jointure peut se faire (WHEN MATCHED),  on met à jour le prix de la table ARTICLES à partir de celui de la table NOUVEAUTES. C'est le cas des articles 1002 et 1003.
  • Quand la jointure ne se fait pas (WHEN NOT MATCHED), on insère un nouvel enregistrement dans la table ARTICLES, à partir des données de la table NOUVEAUTES. C'est le cas de l'article 1005.

Après exécution de la requête, voici le nouveau contenu de notre table "ARTICLES" :
(en rouge, les nouveautés issues de l'instruction MERGE)

CODE DESIGNATION PRIX NOTE AVIS
1001 Tablette tactile 7’ 100 6/10 Manque d’autonomie
1002 Téléphone portable 4’ 120 7/10 Bon
1003 Ordinateur portable 490 6.5/10 Idéal pour la bureautique
1004 Clé USB 15 9 Grande capacité
1005 Montre connectée 300    

Remarques :

  • Restriction : les colonnes référencées dans la clause "ON" ne peuvent pas être mises à jour dans la clause WHEN_MATCHED. Il est donc impossible d’utiliser cette syntaxe pour mettre à jour des champs faisant partie de la clé primaire.
    (dans notre exemple, nous n'aurions pas pu mettre à jour le champ "CODE").
  • Depuis Oracle 10g, l’instruction DELETE est également disponible, mais avec des restrictions ( en complément de l’instruction UPDATE, dans la clause « WHEN MATCHED » uniquement).

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.