Angenommen, Sie haben so etwas:
Quelltabelle (Variable):
Values (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Zieltabelle:
Mapping (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Ich mag verschmelzen Values
in Target
den folgenden Regeln:
- Match on
source.LeftId = target.LeftId AND source.RightId = target.RightId
- Wenn das Ziel übereinstimmt, aktualisieren Sie es
CustomValue
- Wenn das Ziel nicht übereinstimmt, fügen Sie es ein
- Wenn das Ziel übereinstimmt, aktualisieren Sie es
- Löschen Sie alle nicht übereinstimmenden Werte im Ziel, die mit a
LeftId
in der Quelle übereinstimmen , dh löschen Sie nur Datensätze, die sich auf dieLefId
s der Zusammenführung beziehen .
(Diese letzte Regel ist schwer zu beschreiben, sorry!)
Zum Beispiel:
Quelle:
1, 10, foo
1, 11, foo
Ziel:
1, 10, bar
1, 12, foo
2, 20, car
Ergebnis zusammenführen:
Ergebnisziel:
1, 10, foo (updated)
1, 11, foo (inserted)
1, 12, foo (deleted)
2, 20, car (unchanged)
Damit...
Folgendes habe ich bisher, das kümmert sich um update
und insert
:
MERGE Mapping AS target
USING (SELECT LeftId, RightId, CustomValue FROM @Values)
AS source (LeftId, RightId, CustomValue)
ON target.LeftId = source.LeftId
AND target.RightId = source.RightId
WHEN NOT MATCHED THEN
INSERT (LeftId, RightId, CustomValue)
VALUES (source.LeftId, source.RightId, source.CustomValue)
WHEN MATCHED THEN
UPDATE SET
CustomValue = source.CustomValue;
Wie mache ich den delete
Teil meiner Regel?
WHEN NOT MATCHED BY source AND EXISTS(SELECT * FROM @Values M WHERE M.LeftId = target.LeftId) THEN DELETE;