我有两个表,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。提前致谢!
您可以在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