День добрый!
Есть такая задача, скажем зал с рядами и местами.
Есть таблица #d с рядами, местами и статусом, первоначально "I"(inserted)
Вторая таблица #s содержит обновленую информацию, т.е. нужно проапдейтить первую таблицу при помощи данных во второй, но таким образом, что:
1) если есть совпадения(ряд+место), то статус меняется на 'U'
2) если в #s есть хотябы одно место в определенном ряду, то все места в #d в этом ряду, которых нет в #s должны быть помечены как 'D'
3) если есть новые места в #s , то они должны быть внесены в #d
например, имеем:
Нужно чтоб после merge, в первом ряду место 1 и 3 получили статус 'U', 2 и 4 место 'D', ибо оно отсутствует в #s в этом ряду и место 5 в этом ряду нужно занести в #d,
Во втором ряду не было никаких изменений, так его не трогаем
В третьем ряду первое место получает статус 'U', а второе 'D'(отсутствует в #s)
Ну и добавляется 4 место в 4 ряд.
Т.е. по моему разумению нужно делать так:
но невозможно использовать "and d.row<>s.row", а это значит, что и весь второй ряд будет изменен на 'D' :(
Помогите плз правильно решить задачу.
Ну и в догонку, в плане скорости, для этой задачи, если речь может идти о тысячах строк и порядка 30 полей в каждой, то имеет смысл делать Merge или делать в несколько этапов, типа "удалить ,обновить добавить" в три этапа отдельными командами?
Спасибо!
Есть такая задача, скажем зал с рядами и местами.
Есть таблица #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 или делать в несколько этапов, типа "удалить ,обновить добавить" в три этапа отдельными командами?
Спасибо!