Combien de fois le doute s’installe : Les lignes existent-elles des 2 cotés ? Jusqu’à la version 2005, la méthode
consistait à faire un select , puis si la ligne n’existait pas dans l’autre table on l’insérait, sinon on la mettait à jour.
Depuis la version 2008, Sql server nous propose de faire tout ça en une seule passe grâce à l’instruction MERGE.
CREATE TABLE clients (client_id INT PRIMARY KEY, client_nom VARCHAR(10), client_prenom VARCHAR(10), Date_naissance DATETIME) CREATE TABLE prospects ( prospect_id INT PRIMARY KEY, prospect_nom VARCHAR(10), prospect_prenom
VARCHAR(10), Date_naissance DATETIME) INSERT INTO clients VALUES (1,'Dupont', 'Guy','1988-01-01'), (3,'Durand', 'Nicole','1990-03-10'), (5,'Erie', 'Caroline','1984-11-22'), (7,'Toche', 'vincent','1977-07-07'), (8,'Lagerec', 'Isabelle','1989-05-08') INSERT INTO prospects VALUES (1,'Dupont', 'Guy','1977-02-02'),(2,'Kyle', 'Dorine','1981-11-11'), (4,'Ravole', 'Nicolas','1982-02-06'),(5,'Erie', 'Caroline','1984-12-05'), (6,'Kent', 'Cyril','1982-07-15') MERGE clients USING prospects ON (clients.client_id=prospects.prospect_id) WHEN NOT MATCHED THEN INSERT
values (prospects.prospect_id,prospects.prospect_nom, prospects.prospect_prenom,prospects.Date_naissance) WHEN MATCHED THEN UPDATE SET clients.Date_naissance=prospects.Date_naissance;
On retrouve bien les lignes de la table prospects et les lignes de la table clients qui ont été modifiés.
Au niveau syntaxique, il faut simplement penser au ;
Continuez votre lecture sur le blog :
- Verrous sur INSERT IGNORE en mode d’isolation par défaut (David Baffaleuf) [MySQL]
- Retrouver les tables dont les stats ne sont plus compilées en automatique (David Baffaleuf) [SQL Server]
- Nouveautés MySQL 8.0 : Les Histogrammes (Capdata team) [MySQL]
- Oracle et SQL Server: Les Statistiques (Benjamin VESAN) [OracleSQL Server]
- Oracle 19c : Les partitions hybrides (Emmanuel RAMI) [Oracle]
Je connais cette instruction depuis Oracle 9i je crois …:).
Interressant…
encore plus si on y associe la clause OUTPUT pour de l’audite par exemple
Par contre y a t’il des possibilité de filtrer encore plus l’update.
C’est à dire, de ne mettre à jour que sous certaines condition suplémentaire aux critères INSERT/UPDATE
oui il est possible d’ajouter des clauses :
[ WHEN MATCHED [ AND ]
on peut aussi faire ce genre de choses :
WHEN MATCHED AND client_nom = ‘Toche’ THEN DELETE
WHEN MATCHED AND client_nom = ‘Kent’ THEN UPDATE SET prenom_client = ‘louis’