powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с Merge
7 сообщений из 7, страница 1 из 1
Помогите с Merge
    #39722068
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как правильно написать этот Merge.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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шника обновить данные. не дропая все остальные данные при этом.
...
Рейтинг: 0 / 0
Помогите с Merge
    #39722074
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так вы же сами в merge написали, что надо удалять того, что нету в source.
Какой результат от вашей команды вы ожидаете?
...
Рейтинг: 0 / 0
Помогите с Merge
    #39722079
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

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

звучит как простой апдейт, мерж зачем? Да ещё и с удалением всего остального
...
Рейтинг: 0 / 0
Помогите с Merge
    #39722080
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;
...
Рейтинг: 0 / 0
Помогите с Merge
    #39722192
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Спасибо. Второй вариант подходит.

А вот первый вариант то не работает. Он стирает данные с ID 20 же:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
...
Рейтинг: 0 / 0
Помогите с Merge
    #39722195
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
аааа. я понял. не сразу, но понял.
имелось ввиду заменить (1) на (2).

пойду возьму конфетку с полки.
...
Рейтинг: 0 / 0
Помогите с Merge
    #39722229
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreА вот первый вариант то не работает.Потому что копипаста до добра не доводит :)
Исправление:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с Merge
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]