Suponha que você tenha algo assim:
Tabela de origem (variável):
Values (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Tabela de destino:
Mapping (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Eu quero mesclar Values
com Target
as seguintes regras:
- Ligar
source.LeftId = target.LeftId AND source.RightId = target.RightId
- quando combinado no destino, atualize
CustomValue
- quando não corresponder no destino, insira
- quando combinado no destino, atualize
- Exclua quaisquer valores não correspondentes no destino que correspondam a
LeftId
na origem, ou seja, exclua apenas os registros relacionados aosLefId
s do que estou mesclando.
(Essa última regra é difícil de descrever, desculpe!)
Por exemplo:
Fonte:
1, 10, foo
1, 11, foo
Alvo:
1, 10, bar
1, 12, foo
2, 20, car
Resultado da mesclagem:
Meta de resultado:
1, 10, foo (updated)
1, 11, foo (inserted)
1, 12, foo (deleted)
2, 20, car (unchanged)
Então...
Aqui está o que eu tenho até agora, que cuida update
e 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;
Como faço a delete
parte da minha regra?