Về mặt lý thuyết, cần có một giải pháp để thực hiện điều này trong một câu lệnh duy nhất, nhưng tôi vẫn chưa tìm ra nó. *
Đây là cách nó có thể được thực hiện với hai MERGE
tuyên bố:
WITH CTE_trgt AS
(
SELECT c.compid, c.ownerid, t.projid, t.active
FROM component c
INNER JOIN trace t ON c.compid = t.compid
)
MERGE CTE_trgt t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY TARGET
THEN INSERT (ownerid)
VALUES (s.ownerid)
OUTPUT
INSERTED.compid, s.projid, 1 INTO trace;
MERGE trace t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0;
* Phần cập nhật cột Hoạt động:
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0
sẽ có thể phù hợp với truy vấn phía trên tạo câu lệnh hợp nhất duy nhất cho tất cả các hoạt động, nhưng nó gây ra lỗi:
ngay cả khi đó rõ ràng là một cột duy nhất và cập nhật không hợp nhất thường xuyên hoạt động tốt . Có thể ai đó biết lý do và / hoặc giải pháp cho việc này.