Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przykład prostej instrukcji scalania w SQL Server

Poniższy przykład używa T-SQL do scalania dwóch tabel w SQL Server. Używa VALUES Konstruktor wartości tabeli jako tabela źródłowa.

Załóżmy, że tworzymy taką tabelę:

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;

Wynik:

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

I załóżmy, że chcemy wykonać operację scalania. Chcemy wstawić nowe wiersze, ale jeśli wiersz już istnieje z wartościami pasującymi do tych w naszym źródle, zamiast tego chcemy zaktualizować istniejący wiersz (zamiast wstawiać nowy wiersz).

Możemy to zrobić w ten sposób:

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;

Wynik:

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

Wstawiono dwa nowe wiersze, a jeden zaktualizowano.

Tutaj użyliśmy konstruktora wartości tabeli (VALUES ), aby określić nowe wartości dla tabeli.

W tym przypadku sprawdziliśmy IdiotId i FirstName kolumny. Zasadniczo, jeśli identyfikator i imię są takie same, chcemy zaktualizować istniejący wiersz zamiast wstawiać nowy.

Użyliśmy WHEN MATCHED aby określić, co powinno się stać, gdy dane z naszych VALUES klauzula pasuje do danych w tabeli docelowej. W takim przypadku po prostu aktualizujemy wiersz o nowe dane z VALUES .

Użyliśmy WHEN NOT MATCHED BY TARGET aby określić, co powinno się stać, gdy nie ma dopasowania. W tym przypadku wstawiamy nowy wiersz z nowymi danymi.

Użyliśmy również zmiennej o nazwie @Changes aby wyświetlić wyniki naszej operacji łączenia. Użyliśmy OUTPUT klauzula po operacji łączenia dla tego. To właśnie dało nam wynikową tabelę powyżej.

Możemy teraz sprawdzić tabelę docelową, aby zobaczyć wpływ, jaki miała na nią operacja scalania:

SELECT * FROM Idiots;

Wynik:

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

Widzimy, że Idiot numer 3 (Ned) otrzymał zaktualizowane nazwisko. Widzimy również, że do stołu dodano dwóch nowych idiotów (Lloyd i Harry).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co nowego w SQL Server 2019?

  2. Jak zaktualizować klucz podstawowy

  3. LINQ to SQL Take bez pomijania powoduje wiele instrukcji SQL

  4. SET TEXTSIZE Nie działa w programie SQL Server? Sprawdź to.

  5. Jak zrobić LEWE SEMI JOIN w SQL Server