sql >> Databáze >  >> RDS >> Sqlserver

Příklad jednoduchého příkazu sloučení v SQL Server

Následující příklad používá T-SQL ke sloučení dvou tabulek v SQL Server. Používá VALUES konstruktor hodnoty tabulky jako zdrojovou tabulku.

Předpokládejme, že vytvoříme tabulku takto:

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;

Výsledek:

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

A předpokládejme, že chceme provést operaci sloučení. Chceme vložit nové řádky, ale pokud již existuje řádek s hodnotami, které odpovídají hodnotám v našem zdroji, pak chceme místo toho aktualizovat stávající řádek (místo vkládání nového řádku).

Můžeme to udělat takto:

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;

Výsledek:

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

Byly vloženy dva nové řádky a jeden byl aktualizován.

Zde jsme použili konstruktor hodnot tabulky (VALUES ), chcete-li zadat nové hodnoty pro tabulku.

V tomto případě jsme zkontrolovali IdiotId a FirstName sloupců. V zásadě, pokud jsou ID a jméno stejné, chceme aktualizovat stávající řádek namísto vkládání nového.

Použili jsme WHEN MATCHED specifikovat, co se má stát, když data z našich VALUES klauzule odpovídá datům v cílové tabulce. V tomto případě jednoduše aktualizujeme řádek novými daty z VALUES .

Použili jsme WHEN NOT MATCHED BY TARGET specifikovat, co se má stát, když nedojde k žádné shodě. V tomto případě vložíme nový řádek s novými daty.

Také jsme použili proměnnou nazvanou @Changes k zobrazení výstupu naší operace sloučení. Použili jsme OUTPUT klauzule po operaci sloučení za tímto účelem. To je to, co nám poskytlo výslednou tabulku výše.

Nyní můžeme zkontrolovat cílovou tabulku, abychom viděli dopad, který na ni měla operace sloučení:

SELECT * FROM Idiots;

Výsledek:

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

Vidíme, že Idiot číslo 3 (Ned) aktualizoval své příjmení. Můžeme také vidět, že do stolu byli přidáni dva noví idioti (Lloyd a Harry).


  1. Vytvoření uživatele na MySQL

  2. Jak funguje TIME_FORMAT() v MariaDB

  3. Při pokusu o spuštění pgAdmin4 došlo k chybě

  4. Jak zajistit pravidelné zálohování databází