Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Unisci i dati in due tabelle di destinazione

In teoria, dovrebbe esserci una soluzione per farlo in un'unica affermazione, ma finora non sono riuscito a trovarla. *

Ecco come si può fare con due MERGE dichiarazioni:

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 SQLFiddle

*Parte con aggiornamento della colonna Attivo:

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

dovrebbe essere in grado di adattarsi alla query superiore creando una istruzione di unione singola per tutte le operazioni, ma genera un errore:

anche se si tratta ovviamente di una singola colonna e l'aggiornamento regolare non unito funziona bene . Forse qualcuno conosce una ragione e/o una soluzione per questo.