合併多個資料表中的資料

已完成

在資料庫作業中,有時需要執行 SQL MERGE 作業。 此 DML 選項可讓您根據在另一個資料表中所找到的差異在某個資料表中插入、更新或刪除資料列,以同步這兩個資料表。 要修改的資料表稱為「目標」資料表。 用於決定要變更哪些資料列的資料表則稱為「來源」資料表。

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);