Giả sử bạn có một cái gì đó như thế này:
Bảng nguồn (biến):
Values (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Bảng mục tiêu:
Mapping (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Tôi muốn kết hợp Values
thành Target
với các nguyên tắc sau đây:
- Phù hợp
source.LeftId = target.LeftId AND source.RightId = target.RightId
- khi khớp trong mục tiêu, cập nhật
CustomValue
- khi không khớp trong mục tiêu, chèn
- khi khớp trong mục tiêu, cập nhật
- Xóa bất kỳ giá trị chưa từng có trong các mục tiêu mà làm phù hợp với một
LeftId
trong nguồn, tức là hồ sơ duy nhất xóa mà liên quan đếnLefId
s của những gì tôi đang sáp nhập.
(Quy tắc cuối cùng đó thật khó diễn tả, xin lỗi!)
Ví dụ:
Nguồn:
1, 10, foo
1, 11, foo
Mục tiêu:
1, 10, bar
1, 12, foo
2, 20, car
Kết quả hợp nhất:
Mục tiêu kết quả:
1, 10, foo (updated)
1, 11, foo (inserted)
1, 12, foo (deleted)
2, 20, car (unchanged)
Vì thế...
Đây là những gì tôi có cho đến nay, nó quan tâm update
và insert
:
MERGE Mapping AS target
USING (SELECT LeftId, RightId, CustomValue FROM @Values)
AS source (LeftId, RightId, CustomValue)
ON target.LeftId = source.LeftId
AND target.RightId = source.RightId
WHEN NOT MATCHED THEN
INSERT (LeftId, RightId, CustomValue)
VALUES (source.LeftId, source.RightId, source.CustomValue)
WHEN MATCHED THEN
UPDATE SET
CustomValue = source.CustomValue;
Làm thế nào để tôi thực hiện delete
một phần của quy tắc của tôi?
WHEN NOT MATCHED BY source AND EXISTS(SELECT * FROM @Values M WHERE M.LeftId = target.LeftId) THEN DELETE;