Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fusionner les données dans deux tables de destination

Théoriquement, il devrait y avoir une solution pour le faire en une seule instruction, mais je n'ai jusqu'à présent pas réussi à la trouver. *

Voici comment cela peut être fait avec deux MERGE déclarations :

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;

DÉMO SQLFiddle

* Partie avec mise à jour de la colonne Active :

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

devrait pouvoir tenir dans la requête supérieure en créant une instruction de fusion unique pour toutes les opérations, mais cela génère une erreur :

même s'il s'agit évidemment d'une seule colonne, et la mise à jour régulière sans fusion fonctionne correctement . Peut-être que quelqu'un connaît une raison et/ou une solution de contournement pour cela.