Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с Merge  [new]
WaspNewCore
Member

Откуда:
Сообщений: 182
Подскажите как правильно написать этот Merge.

Исходные данные следующие:

declare @t1 table (id int, fieldname nvarchar(max))

INSERT INTO @t1  VALUES (10, 'A1');
INSERT INTO @t1  VALUES (10, 'A2');
INSERT INTO @t1  VALUES (20, 'B1');

select * from @t1

MERGE @t1 AS T
USING (VALUES
	(10, 'A1')
	, (10, 'A4')
	) AS S(id, fieldname)
ON S.fieldname = T.fieldname and S.id = T.id
WHEN NOT MATCHED BY TARGET THEN
	INSERT(id, fieldname)
	VALUES(S.id, S.fieldname)
WHEN NOT MATCHED BY SOURCE THEN
	DELETE;

select * from @t1


В итоге в таблице остаются данные с Id=10. Данные с id=20 удаляются.

А нужно, чтобы команда Merge затронула только те id, которые перечислены в USING (VALUES.
Мне нужно из всей таблицы лишь для одного Idшника обновить данные. не дропая все остальные данные при этом.
24 окт 18, 13:28    [21713451]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Merge  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Ну так вы же сами в merge написали, что надо удалять того, что нету в source.
Какой результат от вашей команды вы ожидаете?

Сообщение было отредактировано: 24 окт 18, 13:34
24 окт 18, 13:33    [21713466]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Merge  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
WaspNewCore,

автор
Мне нужно из всей таблицы лишь для одного Idшника обновить данные. не дропая все остальные данные при этом.

звучит как простой апдейт, мерж зачем? Да ещё и с удалением всего остального
24 окт 18, 13:37    [21713477]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Merge  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
1.
with t as
(select * from @t1 where id = 10)
MERGE @t1 T
USING (VALUES
	(10, 'A1')
	, (10, 'A4')
	) AS S(id, fieldname)
ON S.fieldname = T.fieldname and S.id = T.id
WHEN NOT MATCHED BY TARGET THEN
	INSERT(id, fieldname)
	VALUES(S.id, S.fieldname)
WHEN NOT MATCHED BY SOURCE THEN
	DELETE;

2.
MERGE @t1 T
USING (VALUES
	(10, 'A1')
	, (10, 'A4')
	) AS S(id, fieldname)
ON S.fieldname = T.fieldname and S.id = T.id
WHEN NOT MATCHED BY TARGET THEN
	INSERT(id, fieldname)
	VALUES(S.id, S.fieldname)
WHEN NOT MATCHED BY SOURCE and id= 10 THEN
	DELETE;
24 окт 18, 13:38    [21713479]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Merge  [new]
WaspNewCore
Member

Откуда:
Сообщений: 182
invm,
Спасибо. Второй вариант подходит.

А вот первый вариант то не работает. Он стирает данные с ID 20 же:
declare @t1 table (id int, fieldname nvarchar(max))

INSERT INTO @t1  VALUES (10, 'A1');
INSERT INTO @t1  VALUES (10, 'A2');
INSERT INTO @t1  VALUES (20, 'B1');

select * from @t1

;with t as
(select * from @t1 where id = 10)
MERGE @t1 T
USING (VALUES
	(10, 'A1')
	, (10, 'A4')
	) AS S(id, fieldname)
ON S.fieldname = T.fieldname and S.id = T.id
WHEN NOT MATCHED BY TARGET THEN
	INSERT(id, fieldname)
	VALUES(S.id, S.fieldname)
WHEN NOT MATCHED BY SOURCE THEN
	DELETE;

select * from @t1
24 окт 18, 15:04    [21713691]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Merge  [new]
WaspNewCore
Member

Откуда:
Сообщений: 182
аааа. я понял. не сразу, но понял.
имелось ввиду заменить (1) на (2).

пойду возьму конфетку с полки.
24 окт 18, 15:07    [21713697]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Merge  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
WaspNewCore
А вот первый вариант то не работает.
Потому что копипаста до добра не доводит :)
Исправление:
with t as
(select * from @t1 where id = 10)
MERGE t
USING (VALUES
	(10, 'A1')
	, (10, 'A4')
	) AS S(id, fieldname)
ON S.fieldname = T.fieldname and S.id = T.id
WHEN NOT MATCHED BY TARGET THEN
	INSERT(id, fieldname)
	VALUES(S.id, S.fieldname)
WHEN NOT MATCHED BY SOURCE THEN
	DELETE;
24 окт 18, 15:32    [21713759]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить