這正是MERGE
語法發明的場景,特別是WHEN NOT MATCHED BY SOURCE
條款。
一般來說,將當前狀態值放入暫存表中,然後使用MERGE
來處理INSERT
和DELETE
一次命中的操作。
這裏有一個簡短的素描:
CREATE TABLE Cars (VIN INTEGER NOT NULL UNIQUE);
CREATE TABLE Drivers (driver_licence_number INTEGER NOT NULL UNIQUE);
CREATE TABLE CarDrivers
(
VIN INTEGER NOT NULL REFERENCES Cars (VIN),
driver_licence_number INTEGER NOT NULL
REFERENCES Drivers (driver_licence_number)
);
INSERT INTO Cars VALUES (1), (2), (3);
INSERT INTO Drivers VALUES (22), (55), (99);
INSERT INTO CarDrivers VALUES (1, 22), (1, 55);
CREATE TABLE CarDrivers_staging
(
VIN INTEGER NOT NULL REFERENCES Cars (VIN),
driver_licence_number INTEGER NOT NULL
REFERENCES Drivers (driver_licence_number)
);
INSERT INTO CarDrivers_staging
VALUES (1, 55), -- remains
(1, 99); -- insert
-- DELETE (1, 22)
MERGE INTO CarDrivers
USING CarDrivers_staging S
ON S.VIN = CarDrivers.VIN
AND S.driver_licence_number = CarDrivers.driver_licence_number
WHEN NOT MATCHED THEN
INSERT (VIN, driver_licence_number)
VALUES (VIN, driver_licence_number)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
謝謝。我將不得不在今天晚些時候花點時間看看我能否理解它。 –