Если ваш продукт SQL поддерживает его, вы можете использовать стандартные SQL MERGE
. Если ваш продукт SQL - SQL Server, то вам повезло: его MERGE
имеет отличное расширение IF NOT MATCHED BY SOURCE
, которое позволяет вам DELETE
в дополнение к INSERT
и UPDATE
.
Вот простой пример (например, без ограничения ссылочной целостности):
CREATE TABLE EmployeeDepartments
(
EmployeeID INTEGER NOT NULL,
DepartmentID INTEGER NOT NULL,
UNIQUE (DepartmentID, EmployeeID)
);
INSERT INTO EmployeeDepartments (EmployeeID, DepartmentID)
VALUES (1, 1),
(1, 2);
Скажем, после редактирования вы помещаете значения в промежуточную таблицу:
CREATE TABLE StagingTable
(
EmployeeID INTEGER NOT NULL,
DepartmentID INTEGER NOT NULL,
UNIQUE (DepartmentID, EmployeeID)
);
INSERT INTO StagingTable (EmployeeID, DepartmentID)
VALUES (1, 1),
(1, 3);
На простом английском языке будет вставлена строка {1, 3}
, строка {1, 2}
будет удалена, а строка {1, 1}
останется:
MERGE INTO EmployeeDepartments
USING StagingTable AS S1
ON EmployeeDepartments.EmployeeID = S1.EmployeeID
AND EmployeeDepartments.DepartmentID = S1.DepartmentID
WHEN NOT MATCHED THEN
INSERT (EmployeeID, DepartmentID)
VALUES (EmployeeID, DepartmentID)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;