2016-10-24 6 views
1

У меня есть таблица источникаSQL Merge Ошибка: Оператор MERGE попытался UPDATE или DELETE

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 

и таблицу назначения

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] 

То, что я хочу, чтобы соответствовать на основе MT, MID и

  1. Вставить, если не существует
  2. обновление, если BGID соответствует
  3. удалить, если BGID не соответствует

Когда я использую SQL Merge заявление я получаю ошибку

'Слить оператор пытался UPDATE или DELETE в той же строке несколько раз. Это происходит, когда целевая строка соответствует более чем одной строке источника. Оператор MERGE не может обновлять/удалять одну и ту же строку целевой таблицы несколько раз. Уточните положение ON, чтобы обеспечить целевой строки соответствует более одного источника строки, или используйте предложения GROUP BY для группировки источник rows.`

Мой Merge подобен этому

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] 
); 

Что же я отсутствует?

+0

Удаленный тег 'MySQL', так как вопрос связан с' SQL Server'. Пожалуйста, не используйте ненужные теги при отправке вопроса. – Rahul

+1

Отметить эту должность как только http://stackoverflow.com/questions/1434028/issues-with-sql-server-merge-statement – Rahul

ответ

4

Вы присоединяетесь к таблицам на ON source.MappingId = target.MappingId.

В вашем образце данных есть более 1 строки с одинаковыми MappingId = 185761. Итак, вы получили:

Оператор MERGE не может ОБНОВИТЬ/УДАЛИТЬ одну и ту же строку таблицы целей несколько раз.

Вы должны указать некоторые уникальную комбинацию столбцов присоединиться source и target таблицы.