如何在不使用while循环的情况下更新一对多关系中的多行

时间:2014-07-22 01:48:18

标签: sql sql-server

我在一对多关系中有两个表 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)

2 个答案:

答案 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

对我来说更简单:)