Jes*_*ica 2 sql sql-server-2005
我有两张桌子.
TableA
Userid Starttime reason
John yyyy-mm-dd hh:mm:ss logged in
Table B
Userid Date Starttime reason
John yyyy-mm-dd yyyy-mm-dd hh:mm:ss logged in
Run Code Online (Sandbox Code Playgroud)
我需要用min(a.starttime)更新表B的开始时间,而a.Userid = b.userid,a.starttime = b.date,以及reason ='登录'.
我似乎遇到使用Min(a.starttime)作为我想要用来更新的问题.
我的查询如下:
update B
set B.starttime = (
select Min(A.Starttime)
from table as A
where B.UserID = A.UserID
and (CONVERT(DATETIME,A.DATE,102)) = (CONVERT(DATETIME,B.Date,102)))
and (A.Reason = 'loggedin')
)
from table2 as B
Run Code Online (Sandbox Code Playgroud)
我转换日期,因为表B具有日期,例如2011-09-13 00:00:00,A具有日期和时间.
如果你没有得到正确的结果,可能是因为你需要使用convert(varchar,date,102)而不是convert(datetime,date,102).如果这没有帮助,试试这个.
而不是在SET部分内部执行子查询,而是将其用作派生表并加入它.即使以上修复了结果,下面的查询应该更有效率.
update B
set B.starttime = A.starttime
from table2 as B
INNER JOIN (
select A.UserId, convert(varchar, A.Date, 102) as adate, Min(A.Starttime) as starttime
from table as A
WHERE (A.Reason = 'loggedin')
GROUP BY A.UserId, convert(varchar, A.Date, 102)
) A on B.Nordia_ID = A.UserId and A.adate = convert(varchar, B.StatusDateTime, 102)
Run Code Online (Sandbox Code Playgroud)