Introduction
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 :
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 :
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).