Выбор максимальной даты из нескольких таблиц на основе общего FK - PullRequest
0 голосов
/ 08 октября 2019

Мне кажется, у меня наконец-то есть рабочий запрос для моей ситуации сегодня. Я стараюсь выбрать максимальную дату для нескольких таблиц на основе UserID + VendorID. (Затем обновите каждый LastActivityAt в соответствии с UserID.

. Однако, как только я введу MAX() в PageStatistics, который может содержать много записей, так как это текущий журнал (по сути, пользовательская активность), мой запрос переходитот <1 с до ~ 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
    --)

Кроме того, не знаю, как я идучтобы вернуть это в ОБНОВЛЕНИЕ ... так как я не могу выбрать два столбца!

1 Ответ

0 голосов
/ 08 октября 2019

Запрос. (Обновление 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...