Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Beispiel für eine einfache Merge-Anweisung in SQL Server

Im folgenden Beispiel wird T-SQL verwendet, um zwei Tabellen in SQL Server zusammenzuführen. Es verwendet die VALUES Tabellenwertkonstruktor als Quelltabelle.

Angenommen, wir erstellen eine Tabelle wie diese:

CREATE TABLE Idiots (
    IdiotId int IDENTITY(1,1) NOT NULL,
    FirstName varchar(50),
    LastName varchar(50)
    );

INSERT INTO Idiots VALUES 
    ('Peter', 'Griffin'), 
    ('Homer', 'Simpson'), 
    ('Ned', 'Flanders');

SELECT * FROM Idiots; 

Ergebnis:

+-----------+------------+------------+| IdiotId | Vorname | Nachname ||-----------+------------+------------|| 1 | Peter | Greif || 2 | Homer | Simpson || 3 | Ned | Flandern |+-----------+------------+------------+

Angenommen, wir möchten eine Zusammenführungsoperation durchführen. Wir möchten neue Zeilen einfügen, aber wenn bereits eine Zeile mit Werten vorhanden ist, die mit denen in unserer Quelle übereinstimmen, möchten wir stattdessen die vorhandene Zeile aktualisieren (anstatt eine neue Zeile einzufügen).

Wir können das so machen:

DECLARE @Changes TABLE(Change VARCHAR(20));

MERGE INTO Idiots AS Target  
USING ( VALUES 
            (3, 'Ned', 'Okily Dokily!'), 
            (4, 'Lloyd','Christmas'), 
            (5, 'Harry', 'Dunne')
        ) AS Source ( IdiotId, FirstName, LastName )  
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
    UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;

SELECT Change, COUNT(*) AS Count  
FROM @Changes  
GROUP BY Change; 

Ergebnis:

+----------+---------+| Ändern | Zähle ||----------+---------|| EINFÜGEN | 2 || AKTUALISIEREN | 1 |+----------+---------+

Zwei neue Zeilen wurden eingefügt und eine wurde aktualisiert.

Hier haben wir einen Tabellenwertkonstruktor verwendet (VALUES ), um die neuen Werte für die Tabelle anzugeben.

In diesem Fall haben wir die IdiotId überprüft und FirstName Säulen. Wenn die ID und der Vorname gleich sind, möchten wir grundsätzlich die vorhandene Zeile aktualisieren, anstatt eine neue einzufügen.

Wir haben WHEN MATCHED verwendet um anzugeben, was passieren soll, wenn Daten aus unseren VALUES -Klausel stimmt mit Daten in der Zieltabelle überein. In diesem Fall aktualisieren wir einfach die Zeile mit den neuen Daten aus VALUES .

Wir haben WHEN NOT MATCHED BY TARGET verwendet um anzugeben, was passieren soll, wenn es keine Übereinstimmung gibt. In diesem Fall fügen wir eine neue Zeile mit den neuen Daten ein.

Wir haben auch eine Variable namens @Changes verwendet , um die Ausgabe unserer Zusammenführungsoperation anzuzeigen. Wir haben den OUTPUT verwendet Klausel nach dem Zusammenführungsvorgang dafür. Das hat uns die obige Ergebnistabelle geliefert.

Wir können jetzt die Zieltabelle überprüfen, um die Auswirkung zu sehen, die die Zusammenführungsoperation darauf hatte:

SELECT * FROM Idiots; 

Ergebnis:

+-----------+------------+---------------+| IdiotId | Vorname | Nachname ||-----------+-------------+---------------|| 1 | Peter | Greif || 2 | Homer | Simpson || 3 | Ned | Okay Dokily! || 4 | Lloyd | Weihnachten || 5 | Harry | Dunne |+-----------+---------------------+---------------+

Wir können sehen, dass der Nachname von Idiot Nummer 3 (Ned) aktualisiert wurde. Wir können auch sehen, dass dem Tisch zwei neue Idioten hinzugefügt wurden (Lloyd und Harry).