Teoretycznie powinno być rozwiązanie, aby to zrobić w jednym oświadczeniu, ale jak dotąd nie udało mi się go znaleźć. *
Oto jak można to zrobić za pomocą dwóch MERGE
oświadczenia:
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;
*Część z aktualizacją aktywnej kolumny:
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0
powinien być w stanie zmieścić się w górnym zapytaniu, tworząc pojedynczą instrukcję scalania dla wszystkich operacji, ale zgłasza błąd:
nawet jeśli jest to oczywiście pojedyncza kolumna, a zwykła aktualizacja bez łączenia działa dobrze . Może ktoś zna powód i/lub obejście tego problemu.