Fusionner des données basées sur plusieurs tables
Dans les opérations de base de données, il est parfois nécessaire d’effectuer une opération SQL MERGE. Cette option DML vous permet de synchroniser deux tables en insérant, en mettant à jour ou en supprimant des lignes dans une seule table en fonction des différences trouvées dans l’autre table. La table en cours de modification est appelée table cible. La table qui est utilisée pour déterminer les lignes à modifier est appelée table source.
MERGE modifie les données en fonction d’une ou plusieurs conditions :
- Lorsque les données sources ont une ligne correspondante dans la table cible, l’instruction peut mettre à jour les données dans la table cible.
- Lorsque les données sources n’ont aucune correspondance dans la cible, l’instruction peut insérer des données dans la table cible.
- Lorsque les données cibles n’ont aucune correspondance dans la source, l’instruction peut supprimer les données cibles.
La syntaxe générale d’une instruction MERGE est indiquée ci-dessous. Nous mettons en correspondance la cible et la source sur une colonne spécifiée, et s’il existe une correspondance entre la cible et la source, nous spécifions une action à effectuer sur la table cible. Si aucune correspondance n’est trouvée, nous spécifions une action. L’action peut être une opération INSERT, UPDATE, ou DELETE. Ce code indique qu’une instruction UPDATE est effectuée lorsqu’il existe une correspondance entre la source et la cible. Une instruction INSERT est effectuée lorsqu’il y a des données dans la source sans données correspondantes dans la cible. Enfin, une instruction DELETE est effectuée quand des données de la cible n’ont aucune correspondance dans la source. Il existe de nombreuses autres formes possibles pour une instruction MERGE.
MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN
UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
INSERT (<column_list>)
VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Vous pouvez utiliser uniquement les éléments de l’instruction MERGE dont vous avez besoin. Par exemple, supposons que la base de données comprenne une table de mises à jour de factures échelonnées, qui comprend une combinaison de révisions de factures existantes et de nouvelles factures. Pour mettre à jour ou insérer des données de facture selon les besoins, vous pouvez utiliser les clauses WHEN MATCHED et WHEN NOT MATCHED.
MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
UPDATE SET i.CustomerID = s.CustomerID,
i.OrderDate = GETDATE(),
i.PurchaseOrderNumber = s.PurchaseOrderNumber,
i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);