Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE --> WHEN NOT MATCHED BY SOURCE AND / 7 сообщений из 7, страница 1 из 1
22.06.2021, 19:01
    #40079426
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MERGE --> WHEN NOT MATCHED BY SOURCE AND
Код: 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
22.06.2021, 19:16
    #40079430
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MERGE --> WHEN NOT MATCHED BY SOURCE AND
a_voronin,

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

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

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

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

Код: 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
23.06.2021, 14:45
    #40079594
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MERGE --> WHEN NOT MATCHED BY SOURCE AND
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE --> WHEN NOT MATCHED BY SOURCE AND / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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