根据通用FK从多个表中选择最大日期

时间:2019-10-08 01:46:51

标签: sql tsql stored-procedures

我相信我终于可以对我今天的情况提出疑问。我正在努力根据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 ...,因为我无法选择两列!

1 个答案:

答案 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