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

Откуда:
Сообщений: 46
Всем привет.
Есть таблица работ(#works); таблица заказов(#workdetail), которая хранит свой код заказа, код работы, статус заказа, комментарий; новые данные приходят в виде таблицы #test, в который содержится код работы и комментарий. На основе кода работы нужно найти заказ со статусом 0 и обновить комментарий на заказе, если нет заказа со статусом 0, то нужно создать новый заказ. Мой код:
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. По факту работает не верно.
19 июл 19, 15:18    [21930344]     Ответить | Цитировать Сообщить модератору
 Re: Не получается MERGE  [new]
aleks222
Member

Откуда:
Сообщений: 952
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);
19 июл 19, 16:59    [21930509]     Ответить | Цитировать Сообщить модератору
 Re: Не получается MERGE  [new]
Kolu4ka
Member

Откуда:
Сообщений: 46
aleks222, код Ваш не рабочий, но пример помог мне сделать нужный запрос. Спасибо!
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);
22 июл 19, 08:39    [21931426]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить