我相信我终于可以对我今天的情况提出疑问。我正在努力根据UserID + VendorID
在多个表格中选择最长日期。 (然后,每个UserID
更新每个LastActivityAt。
但是,当我在MAX()
上引入PageStatistics
时,其中可能包含许多条目,因为它是运行中的日志(本质上是用户活动),所以我的查询从<1s跳到了30秒。 / p>
关于如何改善此问题或更快地重新编写整个内容的任何建议?
--UPDATE [UserRoleMappings] SET LastActivityAt =
--(
SELECT UserID, MAX(CheckDate) AS MaxDate
FROM (
SELECT urm.UserID, (
SELECT Max(v)
FROM (VALUES
(urm.LastLoginAt), (u.UpdatedAt), (u.CreatedAt), (b.CreatedAt), (o.CreatedAt),
((
SELECT MAX(CreatedAt)
FROM [PageStatistics] ps
WHERE ps.TriggerUserID = u.ID
AND ps.AppID = a.ID
))
) AS value(v)
) AS CheckDate
FROM [UserRoleMappings] urm
INNER JOIN [Users] u ON u.ID = urm.UserID
INNER JOIN [Vendors] v ON v.ID = urm.VendorID
INNER JOIN [Apps] a ON v.ID = a.VendorID
INNER JOIN [Bookings] b ON v.ID = b.VendorID
INNER JOIN [Orders] o ON v.ID = o.VendorID
) foo
GROUP BY UserID
--)
此外,我不知道如何将其恢复为UPDATE ...,因为我无法选择两列!
答案 0 :(得分:0)
查询。(MSSQL Join更新)
with data as (
SELECT
UserID, MAX(CheckDate) AS MaxDate
FROM
(
SELECT urm.UserID, (SELECT Max(v)
FROM (VALUES (urm.LastLoginAt), (u.UpdatedAt), (u.CreatedAt), (b.CreatedAt), (o.CreatedAt)
,((SELECT MAX(CreatedAt) FROM [PageStatistics] ps WHERE ps.TriggerUserID = u.ID AND ps.AppID = a.ID))) AS value(v)) AS CheckDate
FROM [UserRoleMappings] urm
INNER JOIN [Users] u ON u.ID = urm.UserID
INNER JOIN [Vendors] v ON v.ID = urm.VendorID
INNER JOIN [Apps] a ON v.ID = a.VendorID
INNER JOIN [Bookings] b ON v.ID = b.VendorID
INNER JOIN [Orders] o ON v.ID = o.VendorID
) foo
GROUP BY UserID
)
UPDATE [UserRoleMappings] SET LastActivityAt = b.MaxDate
FROM [UserRoleMappings] a INNER JOIN data b ON b.UserID = a.UserID
子查询。
UPDATE [UserRoleMappings] SET LastActivityAt = (
SELECT (SELECT Max(v)
FROM (VALUES (urm.LastLoginAt), (u.UpdatedAt), (u.CreatedAt), (b.CreatedAt), (o.CreatedAt)
,((SELECT MAX(CreatedAt) FROM [PageStatistics] ps WHERE ps.TriggerUserID = u.ID AND ps.AppID = a.ID))) AS value(v)) AS CheckDate
FROM [UserRoleMappings] urm
INNER JOIN [Users] u ON u.ID = urm.UserID
INNER JOIN [Vendors] v ON v.ID = urm.VendorID
INNER JOIN [Apps] a ON v.ID = a.VendorID
INNER JOIN [Bookings] b ON v.ID = b.VendorID
INNER JOIN [Orders] o ON v.ID = o.VendorID
WHERE urm.UserID = a.UserID
)
FROM [UserRoleMappings] a