2013-01-17 96 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