2011-01-10 125 views
1

我正在使用SQL Server代理作業爲我的內部Web應用程序創建主用戶表,從其他3個數據庫提取數據; Sharepoint,實踐管理系統和我們的人力資源數據庫。使用另一個嵌套查詢中的值更新SQL表

目前它去......

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是一定要改變。另外,如果有人從共享點或PMS中刪除,則不會在此表上重新創建,這會導致整個數據庫不一致。

我想保留此表中的條目,即使它們從其他系統之一中刪除後也是如此。

我想我想要做的是: 1)馬克在tb_staff全部退出條目爲不活動(使用所謂的主動,並將其設置爲false列) 2)運行查詢的三個連接表和更新每個找到記錄,也標記爲活躍。

我看不到如何在Update語句中嵌套select語句,就像我在這裏使用Insert語句一樣。

我該如何做到這一點?

*請注意我已經將我的SQL編輯到4列並簡化了它,所以小錯誤可能是由於匆忙編輯造成的。真正的查詢要大得多。

+0

以及更新標誌你也想插入新用戶?如果是的話,你在什麼版本的SQL Server?希望2008年,所以你可以使用`merge`! – 2011-01-10 15:41:34

+0

是的,我想更新現有的條目並添加任何新條目。我正在使用SQL Server 2008. – Yeodave 2011-01-10 15:43:26

回答

3
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; 
相關問題