6

我有两个表,Users 和 #TempTable(它是 Users 的子集)。我想更新用户表中的一列 IsActive。如果 #TempTable 中的用户也在 Users 表中,我想设置 IsActive = 1,否则设置 IsActive = 0。

从不在 #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。提前致谢!

4

1 回答 1

7

您可以在 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

于 2013-01-17T21:08:03.847 回答