Теоретично би трябвало да има решение това да се направи в едно изявление, но досега не успях да го намеря. *
Ето как може да се направи с две MERGE
изявления:
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;
*Част с актуализиращата се активна колона:
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0
трябва да може да се побере в горната заявка, създавайки единична инструкция за сливане за всички операции, но извежда грешка:
дори ако очевидно е една колона и обикновената актуализация без сливане работи добре . Може би някой знае причина и/или решение за това.