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

Откуда:
Сообщений: 517
День добрый!
Есть такая задача, скажем зал с рядами и местами.
Есть таблица #d с рядами, местами и статусом, первоначально "I"(inserted)
Вторая таблица #s содержит обновленую информацию, т.е. нужно проапдейтить первую таблицу при помощи данных во второй, но таким образом, что:
1) если есть совпадения(ряд+место), то статус меняется на 'U'
2) если в #s есть хотябы одно место в определенном ряду, то все места в #d в этом ряду, которых нет в #s должны быть помечены как 'D'
3) если есть новые места в #s , то они должны быть внесены в #d
например, имеем:
create table #d (row int,seat int, status char(1))
create table #s (row int,seat int)

insert into #d
select 1,1,'I' union
select 1,2,'I' union
select 1,3,'I' union
select 1,4,'I' union
select 2,1,'I' union
select 2,2,'I' union
select 3,1,'I' union
select 3,2,'I' union
select 3,3,'I' 

insert into #s
select 1,1 union
select 1,3 union
select 1,5 union
select 3,1 union
select 4,4 

Нужно чтоб после merge, в первом ряду место 1 и 3 получили статус 'U', 2 и 4 место 'D', ибо оно отсутствует в #s в этом ряду и место 5 в этом ряду нужно занести в #d,
Во втором ряду не было никаких изменений, так его не трогаем
В третьем ряду первое место получает статус 'U', а второе 'D'(отсутствует в #s)
Ну и добавляется 4 место в 4 ряд.

Т.е. по моему разумению нужно делать так:
MERGE #d d
USING #s s
ON d.row=s.row and d.seat=s.seat
WHEN MATCHED THEN
  UPDATE
  SET STATUS='U'

WHEN NOT MATCHED BY TARGET THEN
  INSERT(row , seat ,status )
  VALUES(row , seat ,'I' )
WHEN NOT MATCHED BY SOURCE   -- and d.row<>s.row
   THEN
  UPDATE SET  status='D';

но невозможно использовать "and d.row<>s.row", а это значит, что и весь второй ряд будет изменен на 'D' :(
Помогите плз правильно решить задачу.

Ну и в догонку, в плане скорости, для этой задачи, если речь может идти о тысячах строк и порядка 30 полей в каждой, то имеет смысл делать Merge или делать в несколько этапов, типа "удалить ,обновить добавить" в три этапа отдельными командами?
Спасибо!
22 ноя 17, 21:44    [20976340]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с merge  [new]
invm
Member

Откуда: Москва
Сообщений: 9350
MERGE #d d
USING #s s
ON d.row=s.row and d.seat=s.seat
WHEN MATCHED THEN
  UPDATE
  SET STATUS='U'

WHEN NOT MATCHED BY TARGET THEN
  INSERT(row , seat ,status )
  VALUES(row , seat ,'I' )
WHEN NOT MATCHED BY SOURCE and exists(select * from #s where row = d.row)
   THEN
  UPDATE SET  status='D';
22 ноя 17, 22:19    [20976428]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз разобраться с merge  [new]
abrashka
Member

Откуда:
Сообщений: 517
invm,

Огромное спасибо!
Не знал, что можно использовать exists в NOT MATCHED BY SOURCE
23 ноя 17, 10:27    [20977101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить