基于多个表合并数据

已完成

在数据库操作中,有时需要执行 SQL MERGE 操作。 DML 选项可以在另一个表中找到的差异在一个表中插入、更新或删除行,从而对两个表进行同步。 正在修改的表称为目标表。 用于确定要更改的行的表称为源表。

MERGE 将根据下列一个或多个条件修改数据:

  • 当源数据在目标表中具有匹配行时,MERGE 可以更新目标表中的数据。
  • 当源数据在目标中没有匹配项时,MERGE 可以将数据插入到目标表中。
  • 如果目标数据在源中没有匹配项,则 MERGE 可以删除目标数据。

MERGE 语句的常规语法如下所示。 我们要匹配指定列中的目标和源,如果目标和源之间存在匹配项,我们将指定要对目标表执行的操作。 如果没有匹配项,则指定一个操作。 操作可以是 INSERT、UPDATE 或 DELETE 操作。 此代码指示在源和目标之间存在匹配项时,将执行 UPDATE 操作。 当源中的数据在目标中没有匹配数据时,将执行 INSERT 操作。 最后,当目标中存在与源中不匹配的数据时,将执行 DELETE 操作。 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;

可以只使用 MERGE 语句中你需要的元素。 例如,假设数据库包含一个暂存式发票更新表,其中包括对现有发票和新发票的各种修订。 可以根据需要,使用 WHEN MATCHED 和 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);