web-dev-qa-db-fra.com

Erreur de fusion SQL: l'instruction MERGE a tenté de mettre à jour ou supprimer

J'ai une table source

select 54371 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy],  '2016-10-24 09:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID]
union
select 54372, 'foo', '2016-10-24 09:30:18.548', 'foo',  '2016-10-24 09:30:18.548',  'E', 185761, 2

et une table cible

select 54379 Id, 'foo' [CreateBy], '2016-10-24 09:29:18.548'[CreateDate], 'foo'[UpdateBy],  '2016-10-24 10:29:18.548'[UpdateDate], 'E'[MT], 185761[MID], 3[BGID]

Ce que je veux c'est faire correspondre sur la base de MT, MID et

  1. Insérer s'il n'existe pas
  2. mettre à jour si BGID correspond
  3. supprimer si BGID ne correspond pas

Lorsque j'utilise SQL Merge Statement, j'obtiens une erreur

L'instruction MERGE a tenté de mettre à jour ou de supprimer la même ligne plusieurs fois. Cela se produit lorsqu'une ligne cible correspond à plusieurs lignes source. Une instruction MERGE ne peut pas METTRE À JOUR/SUPPRIMER plusieurs fois la même ligne de la table cible. Affinez la clause ON pour vous assurer qu'une ligne cible correspond à au plus une ligne source, ou utilisez la clause GROUP BY pour grouper les lignes source. "

Ma fusion est comme ça

MERGE   
  FooBar AS target
USING
(
SELECT
E.[Id],
E.[CreateBy],
E.[CreateDate],
E.[UpdateBy],
E.[UpdateDate],
E.[MT],
E.[MID],
E.[BGID]
FROM @FooBar E
) AS source
ON
source.MID = target.MID
AND source.MT = target.MT
WHEN MATCHED and target.[BGID] = source.[BGID] THEN
UPDATE SET
target.[UpdateBy] = Source.[UpdateBy]
,target.[UpdateDate] = Source.[UpdateDate]
When Matched and source.BGID <> target.BGID THEN
DELETE
WHEN NOT MATCHED THEN
INSERT([CreateBy]
,[CreateDate]
,[UpdateBy]
,[UpdateDate]
,[MT]
,[MID]
,[BGID])
VALUES
(
Source.[CreateBy]
,Source.[CreateDate]
,Source.[UpdateBy]
,Source.[UpdateDate]
,Source.[MT]
,Source.[MID]
,Source.[BGID]
);

Qu'est-ce que je rate?

7
Nikhil Agrawal

Vous rejoignez les tables sur ON source.MappingId = target.MappingId.

Dans votre échantillon de données, il y a plus d'une ligne avec le même MappingId = 185761. Alors là, vous avez:

Une instruction MERGE ne peut pas METTRE À JOUR/SUPPRIMER plusieurs fois la même ligne de la table cible.

Vous devez spécifier quelques combinaison de colonnes unique pour joindre les tables source et target.

10
gofr1