Teoretiskt borde det finnas en lösning för att göra detta i ett enda uttalande, men jag har hittills inte lyckats hitta den. *
Så här kan det göras med två MERGE
uttalanden:
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;
*Del med att uppdatera kolumnen Aktiv:
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0
bör kunna passa in i den övre frågan och skapa en single merge-sats för alla operationer, men det ger ett felmeddelande:
även om det uppenbarligen är en kolumn, och vanliga icke-sammanfogade uppdateringar fungerar bra . Kanske någon vet en orsak och/eller en lösning för detta.