Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Mesclar dados em duas tabelas de destino


Teoricamente, deveria haver uma solução para fazer isso em uma única declaração, mas até agora não consegui encontrá-la. *

Aqui está como isso pode ser feito com dois MERGE declarações:
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;

SQLFiddle DEMO

*Parte com atualização da coluna Ativa:
WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0

deve caber na consulta superior criando uma instrução de mesclagem única para todas as operações, mas lança um erro:

mesmo que seja obviamente uma única coluna, e atualização regular sem mesclagem funciona bem . Talvez alguém saiba um motivo e/ou uma solução alternativa para isso.