Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

Помогите плз разобраться с merge

$
0
0
День добрый!
Есть такая задача, скажем зал с рядами и местами.
Есть таблица #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 или делать в несколько этапов, типа "удалить ,обновить добавить" в три этапа отдельными командами?
Спасибо!

Viewing all articles
Browse latest Browse all 7251

Trending Articles