Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Führen Sie Daten in zwei Zieltabellen zusammen

Theoretisch sollte es eine Lösung geben, dies in einer einzigen Anweisung zu tun, aber ich habe sie bisher nicht gefunden. *

Hier ist, wie es mit zwei MERGE gemacht werden kann Anweisungen:

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

*Teil mit Aktualisierung der aktiven Spalte:

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

sollte in der Lage sein, in die obere Abfrage zu passen und eine einzelne Merge-Anweisung zu erstellen für alle Operationen, aber es wird ein Fehler ausgegeben:

auch wenn es sich offensichtlich um eine einzige Spalte handelt und reguläre Aktualisierungen ohne Zusammenführung funktionieren . Vielleicht kennt jemand einen Grund und/oder einen Workaround dafür.