【发布时间】:2021-02-19 05:48:23
【问题描述】:
我有一个 HRUser 和一个 Audit 表,两者都在生产中,有大量行。
现在我在HRUser 表中添加了一个名为IsActivated 的列。
我需要创建一个一次性脚本,该脚本将在生产环境中执行并将数据填充到此IsActivated 列中。在执行此一次性脚本之后,每当用户激活他们的帐户时,HRUser 表的IsActivated 列将自动更新。
为了更新HRUser表中的IsActivated列,我需要检查Audit表中用户是否登录到现在。
UPDATE [dbo].HRUser
SET IsActivated = 1
FROM dbo.[UserAudit] A
JOIN dbo.[HRUser] U ON A.UserId = U.UserId
WHERE A.AuditTypeId = 14
AuditTypeId=14 表示用户已登录并且用户可以登录任意次数,并且每次用户登录时都会在UserAudit 表中捕获...
逻辑是,如果用户至少登录过一次,则意味着用户被激活。
这不能在较低的环境中测试,它需要直接在生产环境中执行,因为在较低的环境中我们在UserAudit 表中没有任何数据。
我不确定这是否有效,因为我从未在更新语句中使用过联接,我正在寻找比这更好的方法来完成我的任务的建议
【问题讨论】:
-
似乎
WHERE中的EXISTS在这里会更好,而不是JOIN;虽然(假设用户只能有 1 行AuditTypeId的值为14)这应该可以工作。唯一奇怪的语法是你有UPDATE [dbo].HRUser但HRUser出现在JOIN中。我希望UPDATE U然后dbo.[HRUser] U在FROM和dbo.[UserAudit]加入。 -
"这无法测试..." 哦,是的,它当然可以 - 但是懒惰会阻止您输入一些捏造的测试数据。如果没有非常特殊的原因,绝不应该在未经 QA 环境测试的生产机器上运行脚本。
-
@Larnu UserAudit 表中的单个用户可以有多个条目,因为用户可以多次登录
-
这就是为什么我提出警告并建议
EXISTS。
标签: sql sql-server sql-update subquery inner-join