powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE --> WHEN NOT MATCHED BY SOURCE AND
7 сообщений из 7, страница 1 из 1
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079426
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
IF OBJECT_ID('tempdb..#TestMerge') IS NOT NULL 
	DROP TABLE #TestMerge;
GO

CREATE TABLE #TestMerge 
(
	ID INT NOT NULL, 
	K INT  NOT NULL,
	T VARCHAR(40)  NOT NULL
);

;WITH X AS 
(
	SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
)
INSERT INTO #TestMerge(ID, K, T)
SELECT TOP 30 RN, RN % 4, RIGHT(CONCAT('0000', RN % 17), 3) FROM 
(
	SELECT 
		-1 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
	FROM X AS X1, X AS X2
) XX
ORDER BY RN ;

SELECT * FROM #TestMerge
ORDER BY K, T;


		

		MERGE #TestMerge AS target 
		USING (
			SELECT TOP 7 ID, K, T + T AS T FROM #TestMerge WHERE K = 0 ORDER BY ID
			UNION ALL 
			SELECT TOP 7 9999, 0, '999999'
		) AS source 
		ON	source.ID = target.ID AND 
			source.K = target.K
		WHEN MATCHED AND (
			source.T			 <> target.T
		)																																				 
		THEN UPDATE SET 
			T					 = source.T
		WHEN NOT MATCHED BY TARGET THEN 
			INSERT (ID, K, T)
			VALUES (
				ID, K, T
			)
		WHEN NOT MATCHED BY SOURCE AND target.K = 0
		THEN 
			DELETE 
				;

SELECT * FROM #TestMerge
ORDER BY K, T;



Господа, есть такой вопрос. Вот что делать, если надо удалить какие данные, но условия более сложное. То есть есть список продаж по торговой точке по кассе и надо сделать merge именно такого снапшота. как тут правильно поступить? Грубо говоря надо написать что-то вроде AND (target.K, target.L, target.M) IN SELECT K, L , M from .... ). Какие тут есть варианты?
...
Рейтинг: 0 / 0
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079430
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Target-таблицу оформите в виде CTE. Внутри оного CTE вы можете задать любые нужные вам критерии фильтрации.
...
Рейтинг: 0 / 0
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079433
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Не вчитывался в запрос, но не совсем понятно в чем проблема.
exists вполне допустим в when кляузе merge-а

что-то типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
drop table if exists #T
drop table if exists #S
drop table if exists #M

create table #T (id int, f int, mark int)
create table #S (id int, f int)
create table #M(mark int)

insert #t (id, f, mark)
values (1,1,1),(2,2,2)

insert #S(id, f)
values (3,3)

insert #M(mark)
values (1)



;merge #T as target
using #S as source on target.id = source.id
when not matched by target then 
	insert (id, f, mark)
	values (source.id, source.f, 1)
when not matched by source and (
		exists (
			select *
			from #M x
			where
				target.mark = x.mark
		)
	) then delete;


select *
from #T
...
Рейтинг: 0 / 0
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079435
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael
a_voronin,

Target-таблицу оформите в виде CTE. Внутри оного CTE вы можете задать любые нужные вам критерии фильтрации.

Это если фильтровать нужно для всех when частей, если условия разные в каждой части, то фильтровать нужно в when
...
Рейтинг: 0 / 0
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079449
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допускается несколько

Код: sql
1.
NOT MATCHED BY SOURCE and ...
...
Рейтинг: 0 / 0
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079590
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем тестовый скрипт выглядит вот так.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
IF OBJECT_ID('tempdb..#TestMerge') IS NOT NULL 
	DROP TABLE #TestMerge;
GO

CREATE TABLE #TestMerge 
(
	ID INT NOT NULL, 
	K INT  NOT NULL,
	T VARCHAR(40)  NOT NULL
);

;WITH X AS 
(
	SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
)
INSERT INTO #TestMerge(ID, K, T)
SELECT TOP 30 RN, RN % 4, RIGHT(CONCAT('0000', RN % 17), 3) FROM 
(
	SELECT 
		-1 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
	FROM X AS X1, X AS X2
) XX
ORDER BY RN ;

SELECT * FROM #TestMerge
ORDER BY K, T;

IF OBJECT_ID('tempdb..#IDS') IS NOT NULL 
	DROP TABLE #IDS;

CREATE TABLE #IDS(KK INT NOT NULL);
INSERT INTO #IDS(KK) VALUES(0), (1)

;



		WITH t AS (
			SELECT t.* FROM #TestMerge t		
			INNER JOIN #IDS I ON I.KK = t.K 
		) 
		MERGE t AS target 
		USING (
			SELECT ID, K, T + T AS T FROM #TestMerge WHERE K IN (1, 0) AND ID <= 20
			UNION ALL 
			SELECT 9999, 0, '999999'
			UNION ALL 
			SELECT 8888, 1, '888888'
		) AS source 
		ON	source.ID = target.ID AND 
			source.K = target.K
		WHEN MATCHED AND (
			source.T			 <> target.T
		)																																				 
		THEN UPDATE SET 
			T					 = source.T
		WHEN NOT MATCHED BY TARGET THEN 
			INSERT (ID, K, T)
			VALUES (
				ID, K, T
			)
		WHEN NOT MATCHED BY SOURCE
		THEN 
			DELETE 
				;

SELECT * FROM #TestMerge
ORDER BY K, T;

...
Рейтинг: 0 / 0
MERGE --> WHEN NOT MATCHED BY SOURCE AND
    #40079594
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Господа, есть такой вопрос. Вот что делать, если надо удалить какие данные, но условия более сложное. То есть есть список продаж по торговой точке по кассе и надо сделать merge именно такого снапшота. как тут правильно поступить? Грубо говоря надо написать что-то вроде AND (target.K, target.L, target.M) IN SELECT K, L , M from .... ). Какие тут есть варианты?
Код: sql
1.
AND exists(select target.K, target.L, target.M intersect SELECT K, L , M from .... )
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE --> WHEN NOT MATCHED BY SOURCE AND
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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