我有两个表,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。提前谢谢!
答案 0 :(得分: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的顺序)。对于少数用户而言,这无关紧要。
我做了而不是测试所以我上面的代码中可能有错误/错误。
根据关于这不起作用的疯狂评论我实施了一个小提琴。
享受它的工作: