Найти в Дзене
Столяров Филипп

Почему Merge королевский оператор языка SQL ? 👑

Например, у Вас есть две простых таблицы: Employees с полями EmployeeID, FirstName и LastName и таблица NewData с аналогичными полями. CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
-- Заполнение таблицы Employees данными (табл_1)
INSERT INTO Employees (EmployeeID, FirstName, LastName)
VALUES (1, 'John', 'Doe'),
(2, 'Jane', 'Smith'),
(3, 'Alice', 'Johnson');
-- Создание таблицы NewData
CREATE TABLE NewData (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
-- Заполнение таблицы NewData данными (табл_2)
INSERT INTO NewData (EmployeeID, FirstName, LastName)
VALUES (2, 'Jane', 'Peterson'),
(4, 'Sarah', 'Williams'); Вы хотите обновить существующие данные в основной таблице Employees и добавить новые, на основании содержимого таблицы NewData
Для этого вам понадобится оператор Merge. MERGE INTO Employees AS target
USING NewData AS source
ON target.EmployeeID = sour

Например, у Вас есть две простых таблицы: Employees с полями EmployeeID, FirstName и LastName и таблица NewData с аналогичными полями.

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);

-- Заполнение таблицы Employees данными (табл_1)
INSERT INTO Employees (EmployeeID, FirstName, LastName)
VALUES (1, 'John', 'Doe'),
(2, 'Jane', 'Smith'),
(3, 'Alice', 'Johnson');

-- Создание таблицы NewData
CREATE TABLE NewData (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);

-- Заполнение таблицы NewData данными (табл_2)
INSERT INTO NewData (EmployeeID, FirstName, LastName)
VALUES (2, 'Jane', 'Peterson'),
(4, 'Sarah', 'Williams');
табл_1
табл_1

табл_2
табл_2

Вы хотите обновить существующие данные в основной таблице Employees и добавить новые, на основании содержимого таблицы NewData
Для этого вам понадобится оператор
Merge.

MERGE INTO Employees AS target
USING NewData AS source
ON target.EmployeeID = source.EmployeeID
WHEN MATCHED THEN
UPDATE SET target.FirstName = source.FirstName, target.LastName = source.LastName
WHEN NOT MATCHED THEN
INSERT (EmployeeID, FirstName, LastName)
VALUES (source.EmployeeID, source.FirstName, source.LastName);
Результат
Результат

В результате этого запроса вы получили новую запись в id4 в основной таблице Employees, а у Jane обновилась новая фамилия id 2.
Обратите внимание, что данные которые уже существовали
Employees, но из таблицы NewData не поступили - остались без изменений id1 и id3.

✔️Благодарю за прочтение.

✔️Больше полезного на этом обучающем сайте

✔️ YouTube-канал с бесплатными уроками по SQL.