Einführung in die MERGE-Anweisung und die SQL Server-Datenänderung
Mit der MERGE-Anweisung werden Änderungen in einer Tabelle basierend auf Werten vorgenommen, die mit anderen übereinstimmen. Es kann verwendet werden, um Einfüge-, Aktualisierungs- und Löschvorgänge in einer Anweisung zu kombinieren. In diesem Artikel erfahren Sie, wie Sie die MERGE-Anweisung verwenden. Wir diskutieren einige bewährte Methoden, Einschränkungen und Zusammenfassungen anhand mehrerer Beispiele.
Dies ist der fünfte Artikel in einer Reihe von Artikeln. Sie können am Anfang mit der Einführung in SQL Server-Datenänderungsanweisungen beginnen.
Alle Beispiele für diese Lektion basieren auf Microsoft SQL Server Management Studio und der AdventureWorks2012-Datenbank. Sie können mit diesen kostenlosen Tools in meinem Handbuch Erste Schritte mit SQL Server
beginnen, bevor wir beginnen
Obwohl dieser Artikel die AdventureWorks-Datenbank für seine Beispiele verwendet, habe ich mich für die Erstellung entschieden Mehrere Beispieltabellen zur Verwendung in der Datenbank zur besseren Veranschaulichung der behandelten Konzepte. Das Skript, das Sie ausführen müssen, finden Sie hier. Beachten Sie, dass es einen speziellen Abschnitt zu MERGE gibt.
Grundstruktur
Die MERGE-Anweisung kombiniert INSERT-, DELETE- und UPDATE-Operationen in einer Tabelle. Sobald Sie verstanden haben, wie es funktioniert, werden Sie feststellen, dass es die Vorgehensweise vereinfacht, indem alle drei Anweisungen separat zum Synchronisieren von Daten verwendet werden.
Nachfolgend finden Sie ein verallgemeinertes Format für die Zusammenführungsanweisung.
MERGE targetTableUsing sourceTableON mergeConditionWHEN MATCHEDTHEN updateStatementWHEN NOT MATCHED BY TARGETTHEN insertStatementWHEN NOT MATCHED BY SOURCETHEN deleteStatement
Die Merge-Anweisung verwendet zwei Tabellen, die sourceTable und die targetTable. Die Zieltabelle ist die Tabelle, die basierend auf den in der Quelltabelle enthaltenen Daten geändert werden soll.
Die beiden Tabellen werden unter Verwendung einer mergeCondition verglichen . Diese Bedingung gibt an, wie Zeilen aus der Quelltabelle mit der Zieltabelle abgeglichen werden. Wenn Sie mit INNER JOINS vertraut sind, können Sie sich dies als Verknüpfungsbedingung vorstellen, die zum Abgleichen von Zeilen verwendet wird.
In der Regel stimmen Sie mit einer eindeutigen Kennung überein, z. B. einem Primärschlüssel. Wenn die Quelltabelle NewProduct und Target ProductMaster und der Primärschlüssel für beide ProductID wäre, wäre eine gute Zusammenführungsbedingung:
NewProduct.ProductID = ProductMaster.ProductID
Eine Zusammenführungsbedingung ergibt sich in einem von drei Zuständen: MATCHED, NOT MATCHED oder NOT MATCHED BY SOURCE.
Zusammenführungsbedingungen
Lassen Sie uns untersuchen, was die verschiedenen Bedingungen bedeuten:
MATCHED – Dies sind Zeilen, die die Übereinstimmungsbedingung erfüllen. Sie sind sowohl der Quell- als auch der Zieltabelle gemeinsam. In unserem Diagramm werden sie grün angezeigt. Wenn Sie diese Bedingung in einer Fusionserklärung verwenden, werden Sie; Am ehesten werden die Zielzeilenspalten mit den Spaltenwerten von sourceTable aktualisiert.
NOT MATCHED – Dies wird auch als NOT MATCHED BY TARGET bezeichnet. Dies sind Zeilen aus der Quelltabelle, die mit keinen Zeilen in der Zieltabelle übereinstimmen. Diese Zeilen werden durch den blauen Bereich oben dargestellt. In den meisten Fällen kann daraus geschlossen werden, dass die Quellzeilen zur Zieltabelle hinzugefügt werden sollen.
NICHT MIT DER QUELLE ZUSAMMENGEPASST – Dies sind Zeilen in der Zieltabelle, die von einem Quelldatensatz nie abgeglichen wurden. Dies sind die Zeilen im orangefarbenen Bereich. Wenn Sie die targetTable-Daten vollständig mit der Quelle synchronisieren möchten, verwenden Sie diese Übereinstimmungsbedingung, um Zeilen zu LÖSCHEN.
Wenn Sie Probleme haben, die Funktionsweise zu verstehen, berücksichtigen Sie die Zusammenführungsbedingung eine Join-Bedingung. Zeilen im grünen Bereich stellen Zeilen dar, die der Zusammenführungsbedingung entsprechen. Zeilen im blauen Bereich sind die Zeilen, die in der SourceTable, jedoch nicht im Ziel gefunden wurden. Die Zeilen im orangefarbenen Abschnitt sind die Zeilen, die nur im Ziel gefunden werden.
Wenn Sie diese übereinstimmenden Szenarien angeben, können Sie Aktivitäten zum Hinzufügen, Entfernen und Aktualisieren einfach in eine einzelne Anweisung integrieren, um Änderungen zwischen zwei zu synchronisieren Tabellen.
Schauen wir uns ein Beispiel an.
MERGE-Beispiel
Nehmen wir an, unser Ziel ist es, alle an esqlProductSource vorgenommenen Änderungen mit esqlProductTarget zu synchronisieren. Hier ist ein Diagramm dieser beiden Tabellen:
Hinweis: In diesem Beispiel habe ich die Skripte ausgeführt, über die ich gesprochen habe In der Einführung zum Erstellen und Auffüllen von zwei Tabellen: esqlProductSource und esqlProductTarget.
Bevor wir die MERGE-Anweisung erstellen, schauen wir uns an, wie wir die Tabelle mit den Anweisungen UPDATE, INSERT und DELETE synchronisieren, um sie zu ändern und hinzuzufügen und entfernen Sie Zeilen in der Zieltabelle.
Wenn Sie einmal gesehen haben, wie wir dies einzeln tun, ist es sinnvoller, die Kombination in einer einzigen Operation zu sehen.
Verwenden von UPDATE zum Synchronisieren von Änderungen Von einer Tabelle zur nächsten
Um die Zieltabelle mit den geänderten Werten in der Produktquelle zu aktualisieren, können Sie eine UPDATE-Anweisung verwenden. Da die ProductID der Primärschlüssel beider Tabellen ist, wird sie zu unserer besten Wahl für Übereinstimmungszeilen zwischen den Tabellen.
Wenn wir die Spaltenwerte in der Zieltabelle mithilfe der Quellspalten aktualisieren möchten, können wir dies mit der folgenden Aktualisierungsanweisung tun.
UPDATE esqlProductTargetSET Name = S.Name, ProductNumber = S.ProductNumber, Color = S.ColorFROM esqlProductTarget T INNER JOIN esqlProductSource S ON S.ProductID = T.ProductID
Diese Anweisung aktualisiert die Spalte in esqlProductTarget mit den entsprechenden Spaltenwerten in esqlProductSource, um die Produkt-IDs abzugleichen.
INSERT-Zeilen in einer Tabelle, aber nicht in der anderen
Schauen wir uns nun an, wie wir vorgehen kann die Zeilen aus der Quelltabelle identifizieren, die wir in das Produktziel einfügen müssen. Zu diesem Zweck können wir Unterabfragen verwenden, um Zeilen in der Quelltabelle zu finden, die nicht im Ziel enthalten sind.
INSERT INTO esqlProductTarget (ProductID, Name, ProductNumber, Color)SELECT S.ProductID, S.Name, S.ProductNumber,
read more