Zusammenführen von Daten basierend auf mehreren Tabellen

Abgeschlossen

Bei Datenbankvorgängen muss manchmal ein SQL MERGE-Vorgang ausgeführt werden. Mit dieser DML-Option können Sie zwei Tabellen synchronisieren, indem Sie Zeilen in einer Tabelle basierend auf den in der anderen Tabelle gefundenen Unterschieden einfügen, aktualisieren oder löschen. Die Tabelle, die geändert wird, wird als Zieltabelle bezeichnet. Die Tabelle, mit der bestimmt wird, welche Zeilen geändert werden sollen, wird als Quelltabelle bezeichnet.

MERGE ändert Daten auf Grundlage einer oder mehrerer Bedingungen:

  • Wenn für Quelldaten eine übereinstimmende Zeile in der Zieltabelle vorhanden ist, können die Daten in der Zieltabelle aktualisiert werden.
  • Wenn für Quelldaten keine Entsprechung im Ziel vorhanden ist, können Daten in die Zieltabelle eingefügt werden.
  • Wenn für Zieldaten keine Entsprechung in der Quelle vorhanden ist, können die Zieldaten gelöscht werden.

Die allgemeine Syntax einer MERGE-Anweisung ist nachfolgend dargestellt. Es werden Ziel und Quelle für eine angegebene Spalte verglichen, und wenn eine Übereinstimmung zwischen Ziel und Quelle vorliegt, ist eine Aktion angegeben, die für die Zieltabelle ausgeführt werden soll. Für den Fall, dass keine Übereinstimmung vorliegt, ist ebenfalls eine Aktion angegeben. Die Aktion kann ein INSERT-, UPDATE- oder DELETE-Vorgang sein. Dieser Code gibt an, dass ein UPDATE-Vorgang ausgeführt wird, wenn eine Übereinstimmung zwischen Quelle und Ziel vorliegt. Ein INSERT-Vorgang wird ausgeführt, wenn Daten in der Quelle, aber keine übereinstimmenden Daten im Ziel vorhanden sind. Schließlich wird noch ein DELETE-Vorgang ausgeführt, wenn Daten im Ziel, aber keine übereinstimmenden Daten in der Quelle vorhanden sind. Es gibt viele weitere mögliche Formen einer MERGE-Anweisung.

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;

Sie können nur die Elemente der MERGE-Anweisung verwenden, die Sie benötigen. Angenommen, die Datenbank enthält eine Tabelle mit bereitgestellten Rechnungsaktualisierungen, die eine Mischung aus Überarbeitungen vorhandener Rechnungen und neuen Rechnungen enthält. Mithilfe der WHEN MATCHED- und WHEN NOT MATCHED-Klauseln können Sie Rechnungsdaten nach Bedarf aktualisieren oder einfügen.

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