这在标题中解释起来相当复杂。
我有两个表,一个表用于填充用户的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,并更新用户表