2013-01-17 38 views
4

我有兩個表,用戶和#TempTable(它是用戶的子集)。我想更新Users表中的一列IsActive。如果位於#TempTable中的用戶也在Users表中,並且設置IsActive = 0,則我想設置IsActive = 1。使用CASE語句的列中的SQL更新行

獲取用戶未在#TempTable用戶(IsActive應設置爲0,爲這些用戶):

-- (Users \ #TempTable) U (#TempTable \ Users) 
SELECT u.UserName 
FROM Users u 
WHERE (u.UserName) NOT IN 
    (SELECT t.[User Name] FROM #TempTable t) 
UNION ALL 
SELECT t.[User Name] 
FROM #TempTable t 
WHERE (t.[User Name]) NOT IN 
    (SELECT u.UserName FROM Users u) 

讓我們把這種ResultSet中。我會感謝我的UPDATE語句的一些幫助。我希望能夠做的是:

UPDATE Users 
SET IsActive = (CASE WHEN User.UserName IN ResultSet THEN 0 ELSE 1 END) 

而不必寫出每個User.UserName的CASE WHEN。提前致謝!

回答

5

您可以在UPDATE語句中使用連接。

UPDATE Users 
SET Users.Active = CASE WHEN T.UserName is null THEN 0 ELSE 1 END 
FROM Users AS U 
LEFT JOIN #TempTable AS T ON U.UserName = T.UserName 

注:

  • 你也可以使用一個子查詢,但(n個平方不是n的順序排列),這將是慢得多。對於少數用戶來說,這並不重要。

  • 我沒有 不是 測試 所以我可能在 以上的代碼中有一個錯字/錯誤。基於對如何做到這一點不工作,我實現了一個小提琴瘋狂的意見


享受它的工作:

http://sqlfiddle.com/#!6/25235/3