Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Пример за прост оператор за сливане в SQL Server

Следният пример използва T-SQL за сливане на две таблици в SQL Server. Той използва VALUES конструктор на стойност на таблицата като изходна таблица.

Да предположим, че създаваме таблица като тази:

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;

Резултат:

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

И да предположим, че искаме да извършим операция на сливане. Искаме да вмъкнем нови редове, но ако вече съществува ред със стойности, които съвпадат с тези в нашия източник, тогава искаме да актуализираме съществуващия ред вместо това (вместо да вмъкваме нов ред).

Можем да направим това по следния начин:

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;

Резултат:

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

Два нови реда бяха вмъкнати и един бе актуализиран.

Тук използвахме конструктор за стойности на таблица (VALUES ), за да посочите новите стойности за таблицата.

В този случай проверихме IdiotId и FirstName колони. По принцип, ако идентификационният номер и първото име са еднакви, тогава искаме да актуализираме съществуващия ред, вместо да вмъкваме нов.

Използвахме WHEN MATCHED за да уточним какво трябва да се случи, когато данните от нашите VALUES клауза съвпада с данни в целевата таблица. В този случай просто актуализираме реда с новите данни от VALUES .

Използвахме WHEN NOT MATCHED BY TARGET за да уточните какво трябва да се случи, когато няма съвпадение. В този случай вмъкваме нов ред с новите данни.

Използвахме и променлива, наречена @Changes за да видите изхода от нашата операция за сливане. Използвахме OUTPUT клауза след операцията за сливане за това. Това ни даде резултатната таблица по-горе.

Вече можем да проверим целевата таблица, за да видим въздействието, което операцията за сливане е оказала върху нея:

SELECT * FROM Idiots;

Резултат:

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

Можем да видим, че идиот номер 3 (Нед) е актуализирал фамилното си име. Можем също да видим, че към масата са добавени двама нови идиота (Лойд и Хари).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на NOLOCK Hint в EF4?

  2. Създайте свързан сървър в SQL Server (пример за T-SQL)

  3. Преобразувайте името на месеца в номер на месеца в SQL Server

  4. SQL Server Collection Inventory Script -3

  5. възможно ли е да изберете EXISTS директно като бит?