Cours SQL ORACLE – 10 : MERGE
Le MERGE est une instruction utilisée pour mettre ajour des données d’une table par d’autres appartenant à une autre selon une condition d’existence.
Le MERGE et l’association des deux requêtes UPDATE et INSERT dans une seule requête.
La syntaxe du MERGE est comme ci-dessous :
MERGE INTO table_destination -- table_destination est la table à MAJ
USING table_source -- table_source est la table utilisée pour la MAJ
ON (conditions) -- conditions de jointure entre table_destination et table_source
WHEN MATCHED THEN -- Lorsque la condition de jointure est vérifiée alors :
UPDATE SET -- MAJ des données vérifiées par la jointure
table_destination.colonne1 = valeur1,
table_destination.colonne2 = valeur2
WHEN NOT MATCHED THEN -- Lorsque la condition de jointure n’est pas vérifiée alors :
INSERT (colonne1, colonne3) -- Insertion de données inexistantes dans table_destination
VALUES (valeur1, valeur3)
Pour mieux comprendre l’utilité de la commande MERGE, nous allons voir l’exemple ci-dessous :
Nous disposons de deux tables d’employés :
- EMP1 qui est une ancienne table d’employés qui comporte toutes les informations des employés mais qui ne sont pas exhaustives.
- EMP2 une table récente mais qui ne comporte que les salaires des employés avec leur identifiant.
Nous voulons MAJ la table EMP1 par les salaires de la tables EMP2 et nous souhaitons insérer les lignes de EMP2 dans EMP1 si elles sont absentes de cette dernière.
Nous pouvons effectués ces MAJ pas les 2 requêtes suivantes :
update EMP1 set salaire = (select salaire from EMP2 where EMP1.matricule = EMP2.matricule);
insert into EMP1 (matricule, nom, prenom, salaire)
select matricule, nom, prenom, salaire
from EMP2
where matricule not in (select matricule from EMP1);
On peut aussi faire le même traitement en utilisant la requête MERGE comme ci-dessous :
MERGE INTO EMP1
USING EMP2
ON (EMP1.matricule = EMP2.matricule)
WHEN MATCHED THEN
UPDATE SET EMP1.salaire = EMP2.salaire
WHEN NOT MATCHED THEN
INSERT (matricule, nom, prenom, salaire)
VALUES (EMP2.matricule, EMP2.nom, EMP2.prenom, EMP2.salaire);
A signaler que les valeurs utilisées dans l’UPDATE et l’INSERT peuvent être des valeurs fixes et qui n’appartienne pas à la table table_source.