複数のテーブルに基づいてデータをマージする

完了

データベース操作では、SQL MERGE 操作の実行が必要になる場合があります。 この DML オプションを使用すると、他のテーブルとの違いに基づいて、あるテーブル内の行を挿入、更新、または削除することにより、2 つのテーブルを同期することができます。 変更されるテーブルは、"ターゲット" テーブルと呼ばれます。 変更する行を決定するために使用されるテーブルは、"ソース" テーブルと呼ばれます。

MERGE を使用すると、1 つ以上の条件に基づいてデータが変更されます。

  • ソース データと一致する行がターゲット テーブルにある場合、ターゲット テーブル内のデータを更新できます。
  • ソース データと一致するものがターゲットにない場合は、ターゲット テーブルにデータを挿入できます。
  • ターゲット データと一致するものがソースにない場合は、ターゲット データを削除できます。

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