sql >> Database >  >> RDS >> Sqlserver

Voorbeeld van een eenvoudige samenvoeginstructie in SQL Server

In het volgende voorbeeld wordt T-SQL gebruikt om twee tabellen in SQL Server samen te voegen. Het gebruikt de VALUES tabelwaardeconstructor als de brontabel.

Stel dat we een tabel als volgt maken:

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;

Resultaat:

+-----------+-------------+------------+
| IdiotId   | FirstName   | LastName   |
|-----------+-------------+------------|
| 1         | Peter       | Griffin    |
| 2         | Homer       | Simpson    |
| 3         | Ned         | Flanders   |
+-----------+-------------+------------+

En stel dat we een samenvoegbewerking willen uitvoeren. We willen nieuwe rijen invoegen, maar als er al een rij bestaat met waarden die overeenkomen met die in onze bron, dan willen we in plaats daarvan de bestaande rij bijwerken (in plaats van een nieuwe rij in te voegen).

We kunnen dat als volgt doen:

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;

Resultaat:

+----------+---------+
| Change   | Count   |
|----------+---------|
| INSERT   | 2       |
| UPDATE   | 1       |
+----------+---------+

Er zijn twee nieuwe rijen ingevoegd en één is bijgewerkt.

Hier hebben we een tabelwaardeconstructor gebruikt (VALUES ) om de nieuwe waarden voor de tabel op te geven.

In dit geval hebben we de IdiotId . gecontroleerd en FirstName kolommen. Kortom, als de ID en voornaam hetzelfde zijn, willen we de bestaande rij bijwerken in plaats van een nieuwe in te voegen.

We gebruikten WHEN MATCHED om aan te geven wat er moet gebeuren als gegevens van onze VALUES clausule komt overeen met gegevens in de doeltabel. In dit geval werken we de rij gewoon bij met de nieuwe gegevens van VALUES .

We gebruikten WHEN NOT MATCHED BY TARGET om aan te geven wat er moet gebeuren als er geen match is. In dit geval voegen we een nieuwe rij in met de nieuwe gegevens.

We gebruikten ook een variabele genaamd @Changes om de uitvoer van onze samenvoegbewerking te bekijken. We gebruikten de OUTPUT clausule na de samenvoegbewerking hiervoor. Dat is wat ons de resulterende tabel hierboven gaf.

We kunnen nu de doeltabel controleren om de impact te zien die de samenvoegbewerking erop had:

SELECT * FROM Idiots;

Resultaat:

+-----------+-------------+---------------+
| IdiotId   | FirstName   | LastName      |
|-----------+-------------+---------------|
| 1         | Peter       | Griffin       |
| 2         | Homer       | Simpson       |
| 3         | Ned         | Okily Dokily! |
| 4         | Lloyd       | Christmas     |
| 5         | Harry       | Dunne         |
+-----------+-------------+---------------+

We kunnen zien dat Idiot nummer 3 (Ned) zijn achternaam heeft bijgewerkt. We kunnen ook zien dat er twee nieuwe idioten aan de tafel zijn toegevoegd (Lloyd en Harry).


  1. PASS Summit bijwonen in Charlotte?

  2. PostgreSQL vs MySQL, een vergelijking

  3. Twee tabellen samenvoegen met een verschillend aantal kolommen

  4. Databasecorruptie in MS Access en hoe ermee om te gaan