我在一对多关系中有两个表 tblUser 和 tblActivityLog 。 不知何故,我们搞砸了一些数据并需要应用修补程序来解决这个问题。
tblUser 为每个用户包含单行,而 tblActivityLog 根据用户执行的每个操作为一个用户提供多行。 tblUser 中的日期时间列是varchar,而 tblActivityLog 中的日期时间列是日期时间。现在我需要将最后更新日期从 tblActicityLog 更新为 tblUser 。
我知道将datetime设置为varchar非常愚蠢但当时它是合适的。
我需要使用 tblActivityLog 中最新行的日期时间值更新 tblUser 。
其中一种方法是使用while循环,但我想知道是否有更好的方法来实现这一点。我搜索了相关的问题,但找不到与我的问题相近的东西。如果你们知道stackoverflow中的相关问题那么请指点我或者在这里获得一些输入也很棒。
我尝试下面的事情:
架构:
create table #tblUsers
(
user_id int,
datetime_updated varchar(50)
)
create table #tblActivityLog
(
id int identity(1,1),
user_id int,
[datetime_updated] datetime
)
查询:
update #tblUsers u set datetime_updated = (select top 1 [datetime_updated] from
#tblActivityLog where user_id = u.user_id order by [datetime_updated] desc)
修改
使用别名会导致错误,因此一种解决方案是使用以下查询:
update #tblUsers u set datetime_updated = (select top 1 [datetime_updated] from
#tblActivityLog where user_id = #tblUsers.user_id order by [datetime_updated] desc)
答案 0 :(得分:0)
这种结构将为您提供您想要做的一般概念。你可以弄清楚细节。
update tblUsers
set datetime_updated = convert(max_dt, etc)
from tblUsers join
(select user_id uid
, max(datetime_updated) max_dt
from tblActivityLog
group by user_id ) temp on user_id = uid
答案 1 :(得分:0)
使用JOIN而不是子查询进行更新怎么样?
update U set u.datetime_updated = Al.datetime_updated FROM #tblUsers U inner join #tblActivityLog Al on u.user_id = Al.user_id
对我来说更简单:)