Secara teoritis, harus ada solusi untuk melakukan ini dalam satu pernyataan, tetapi sejauh ini saya gagal menemukannya. *
Inilah cara melakukannya dengan dua MERGE
pernyataan:
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;
*Bagian dengan memperbarui kolom Aktif:
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0
harus dapat masuk ke kueri atas dengan membuat pernyataan gabungan tunggal untuk semua operasi, tetapi menimbulkan kesalahan:
bahkan jika itu jelas satu kolom, dan pembaruan non-gabungan reguler berfungsi dengan baik . Mungkin seseorang mengetahui alasan dan/atau solusi untuk ini.