sql >> Base de Datos >  >> RDS >> Sqlserver

Combinar datos en dos tablas de destino

Teóricamente, debería haber una solución para hacer esto en una sola declaración, pero hasta ahora no he podido encontrarla. *

Así es como se puede hacer con dos MERGE declaraciones:

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;

DEMO DE SQLFiddle

*Parte con la actualización de la columna activa:

WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0

debería poder caber en la consulta superior creando una instrucción de combinación única para todas las operaciones, pero arroja un error:

incluso si es obviamente una sola columna, y la actualización regular sin fusión funciona bien . Tal vez alguien sepa una razón y/o una solución para esto.