powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не получается MERGE
3 сообщений из 3, страница 1 из 1
Не получается MERGE
    #39839286
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Есть таблица работ(#works); таблица заказов(#workdetail), которая хранит свой код заказа, код работы, статус заказа, комментарий; новые данные приходят в виде таблицы #test, в который содержится код работы и комментарий. На основе кода работы нужно найти заказ со статусом 0 и обновить комментарий на заказе, если нет заказа со статусом 0, то нужно создать новый заказ. Мой код:
Код: 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.
Create table #works (ID_work int)
Create table #workdetail(ID_det int IDENTITY(1,1), ID_Work int,[Status] int default(0),comment varchar(max))
Create table #test (ID_wrk int, cmnt varchar(max))

insert into #works
select 1
union
select 2

insert into #workdetail (ID_Work,Status,comment)
select 1,1,'com1'
union
select 1,2,'com1-1'
union
select 2,0,'com2'
union
select 2,1,'com2-2'


insert into #test
select 1, 'new_com1'
union
select 2, 'new_com2'
union
select 3, ''

MERGE #workdetail AS d
USING (Select w.ID_work, d.ID_det, d.status, t.cmnt
		From #test t
		Inner Join #works w On t.ID_wrk=w.ID_work
		Inner Join #workdetail d On w.ID_work=d.ID_work 
		Where LEN(t.cmnt)>0
	) AS s
ON ( d.ID_det = s.ID_det and d.Status=0)
WHEN MATCHED  THEN
		UPDATE SET	d.Comment=s.cmnt
WHEN NOT MATCHED THEN
		INSERT (ID_work, Comment)
		VALUES (s.ID_work, s.cmnt);


Я ожидала что для работы с кодом 1 будет создана новая запись, т.к. заказов со статусом 0 нет, а для работы №2 обновится заказ №3, т.к. у него статус 0. По факту работает не верно.
...
Рейтинг: 0 / 0
Не получается MERGE
    #39839401
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Create table #works (ID_work int)
Create table #workdetail(ID_det int IDENTITY(1,1), ID_Work int,[Status] int default(0),comment varchar(max))
Create table #test (ID_wrk int, cmnt varchar(max))

insert into #works
select 1
union
select 2

insert into #workdetail (ID_Work,Status,comment)
select 1,1,'com1'
union
select 1,2,'com1-1'
union
select 2,0,'com2'
union
select 2,1,'com2-2'


insert into #test
select 1, 'new_com1'
union
select 2, 'new_com2'
union
select 3, ''

with t as ( select * from  #workdetail where Status = 0 )
   , x as ( select * from #test )
MERGE t using x ON t.ID_det = x.ID_det
WHEN MATCHED  THEN UPDATE SET Comment = x.cmnt
WHEN NOT MATCHED THEN INSERT (ID_work, Comment) VALUES(ID_work, cmnt);
...
Рейтинг: 0 / 0
Не получается MERGE
    #39839782
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, код Ваш не рабочий, но пример помог мне сделать нужный запрос. Спасибо!
Код: sql
1.
2.
3.
4.
5.
with t as ( select w.ID_Work , w.ID_det, w.comment from  #workdetail w Inner Join #test t On w.ID_Work=t.ID_wrk where w.Status = 0 )
   , x as ( Select t.ID_wrk,  t.cmnt From #test t Where LEN(t.cmnt)>0 )
MERGE t using x ON  t.ID_Work=x.ID_wrk
WHEN MATCHED  THEN UPDATE SET Comment = x.cmnt
WHEN NOT MATCHED THEN INSERT (ID_work, Comment) VALUES(ID_wrk, cmnt);
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не получается MERGE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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