Обновить таблицу SQL значениями из другого вложенного запроса - PullRequest
1 голос
/ 10 января 2011

В настоящее время я использую задание агента SQL Server для создания основной пользовательской таблицы для своих собственных веб-приложений, извлекая данные из 3 других баз данных; Sharepoint, система управления практикой и наша база данных персонала.

В настоящее время идет ...

truncate table my_tools.dbo.tb_staff
go
insert into my_tools.dbo.tb_staff 
 (username
 ,firstname
 ,surname
 ,chargeoutrate)

    select right(wss.nt_user_name,
  ,hr.firstname
  ,hr.surname
  ,pms.chargeoutrate

    from sqlserver.pms.dbo.staff as pms

    inner join sqlserver.wss_content.dbo.vw_staffwss as wss
 on pms.nt_user_name = wss.nt_user_name

    inner join sqlserver.hrdb.dbo.vw_staffdetails as hr
 on wss.fullname = hr.knownas
go

Проблема в том, что вся таблица очищается в качестве первого шага, поэтому мой первичный ключ с автоинкрементом / идентифицированный в tb_staff наверняка изменится. Также, если кто-то удален из sharepoint или PMS, он не будет воссоздан в этой таблице, что приведет к несоответствиям во всей базе данных.

Я хочу сохранить записи в этой таблице даже после их удаления из одной из других систем.

Полагаю, я хочу сделать следующее: 1) Пометить все существующие записи в tb_staff как неактивные (используя столбец с именем active и установить его в false) 2) Запустите запрос к трем объединенным таблицам и обновите каждую найденную запись, также пометив их как активные.

Я не вижу, как я могу вложить оператор select в оператор Update, как здесь с оператором Insert.

Как мне этого добиться?

* пожалуйста, обратите внимание, что я отредактировал свой SQL до 4 столбцов и упростил его, так что небольшие ошибки, вероятно, связаны с быстрым редактированием. Реальный запрос намного больше.

1 Ответ

3 голосов
/ 10 января 2011
WITH source AS(
SELECT RIGHT(wss.nt_user_name, 10) nt_user_name, /*Or whatever - this is invalid in the original SQL*/
       hr.firstname,
       hr.surname,
       pms.chargeoutrate
FROM   staff AS pms
       INNER JOIN vw_staffwss AS wss
         ON pms.nt_user_name = wss.nt_user_name
       INNER JOIN vw_staffdetails AS hr
         ON wss.fullname = hr.knownas  
)
MERGE 
        INTO tb_staff
        USING source
        ON source.nt_user_name= tb_staff.username /*Or whatever you are using as the key */
          WHEN MATCHED 
            THEN UPDATE SET active=1  /*Can synchronise other columns here if needed*/
        WHEN NOT MATCHED BY TARGET 
            THEN INSERT (username, firstname, surname, chargeoutrate, active) VALUES (nt_user_name,firstname, surname, chargeoutrate, 1)
        WHEN NOT MATCHED BY source 
            THEN UPDATE SET active=0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...