2016-05-04 92 views
0

这在标题中解释相当复杂。SQL Server:选择TOP Records并在另一个表中更新结果

我有两个表,一个填充用户的Web访问,另一个是具有存储最后登录日期的字段的用户表。 。

我想每个用户基础上的最新用户访问是否是上次登录的日期(如果它们在user表中登记的

这将是用户在存储过程中

注:我已略表的相关列。

[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表中存在的每个用户。

谢谢!

回答

0

我建议你不要对用户最后登录场表。除非你有一些性能问题,否则我会建议一个索引视图。

的观点看起来像

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

如果你真的想在用户表坚持这个数据我会建议你使用上面的SQL语句作为您工作的基础。有许多方法可以更新用户表。最好的可能是带有连接的更新声明。

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

+0

Users.User'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。我不希望在用户表中使用该列,但之后的存储过程会禁用用户帐户(如果它们在X天内未处于活动状态)。我们失去了我们的整个数据库团队,.NET开发人员坚持不懈。 –

+1

@MichaelHartmann你只需要在查询结尾添加Group By U.User',但我必须同意根据上面的注释,你不需要更新表来存储只用于一个停用用户的过程。更新,然后检查Last_Login_Dt字段将花费更多的时间,而不仅仅是取消激活查询中的MAX(LogOn_Date)。 – JamieD77

+0

Joe的看法很有效,并且按照你的建议,这将是理想的做法,但是,我不知道如何将视图与禁用用户的SP相结合。我们所有的SQL员工都被移走了,离开了.NET开发人员。 @ jamieD77 –

0
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这是最近的登录和更新用户表

+0

能否请您扩大这是什么一样,它是如何解决的OP? –

+0

@RoYoMi派生表按用户登录日期排序。加入它的用户,但只拉1级,这是最近登录并更新用户表。 – SQLChao

1

查询:

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] 
0
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] 
相关问题