SQL Server:选择TOP记录并更新另一个表中的结果



这在标题中解释起来相当复杂。

我有两个表,一个表用于填充用户的web访问,另一个表是用户表,它有一个存储上次登录日期的字段。

我想根据每个用户的最近一次用户访问来确定最后一次登录日期(如果他们在用户表中注册的话)。

这将是存储过程中的用户。

注:我已将表格缩写为相关列。

[Login]

   [User] [VARCHAR](15) NOT NULL,
   [LogOn_Date] [DATETIME] NOT NULL

[Users]

   [User] [varchar](15) NOT NULL,
   [Last_Login_Dt] [datetime] NULL

我希望从Login表中的每个用户中选择最新日期[LogOn_Date],然后用[Last_Login_Dt]列中与用户匹配的[LogOn_Date]值更新Users表。

注意:并非所有登录的用户都在Users表中,我通过windows身份验证跟踪每个人,无论他们是否是用户,但只想更新users表中的每个用户。

谢谢!

查询:

UPDATE u
SET u.Last_Login_Dt = l.LogOn_Date
FROM Users u
JOIN (SELECT 
      [User],
      max(LogOn_Date) AS LogOn_Date
      FROM Login
      GROUP BY [User]) l ON u.[User]= l.[User]

我建议您不要在users表上有最后登录字段。除非您有一些性能问题,否则我建议您使用索引视图。

视图看起来像

Select
   U.User, Max(L.LogOnDate)
   From Users U
   Join Login L On L.User = U.User

如果你真的想在users表中保留这些数据,我建议你使用上面的Sql语句作为你工作的基础。有多种方法可以更新用户表。最好的可能是带有联接的更新语句。

http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/

update [Users]
set [Last_Login_Dt] = a.Last_Login_Dt
from 
    (select [User], max([Login_date]) as Last_Login_Dt 
     from Login 
     group by [User]) a 
join [SampleDb].[dbo].[Users] b on a.[User] = b.[User] 
UPDATE u
SET u.Last_Login_Dt = l.LogOn_Date
FROM Users u
JOIN (SELECT *,
      ROW_NUMBER() OVER (PARTITION BY User, ORDER BY LogOn_Date DESC) AS rn
      FROM Login) l ON u.user = l.user and l.rn = 1

派生表按日期对用户登录进行排名。将其重新加入到用户中,但只提取最近登录的排名1,并更新用户表

最新更新