SQL обновить несколько строк на основе значения в одной из строк - PullRequest
2 голосов
/ 27 мая 2020

У меня есть процесс, который ежедневно выполняется в потоке данных и обновляет last_update_time (поле datetime) для всех элементов в нашей базе данных инвентаризации, которые присутствуют в потоке данных. Проблема, с которой я сталкиваюсь, заключается в том, что когда элемент удаляется из канала данных, его last_updated_time больше не обновляется в базе данных моим процессом. После удаления элемента из потока данных я все еще хочу, чтобы его last_update_time обновлялся, пока существует элемент, который имеет тот же item_group_id (nvarchar), что и этот элемент.

т.е. если в базе данных существует элемент, last_updated_time которого был обновлен моим процессом, и который разделяет item_group_id с другими элементами, которые больше не существуют в потоке данных, я хочу, чтобы их last_update_time был установлен на максимальное значение недавнее last_update_time любого элемента, который имеет этот item_group_id.

Для целей этого вопроса мы говорим обо всех столбцах в одной таблице (фактический запрос более сложен, но я уменьшил его для ясности).

Итак, для начала это выглядит так:

ItemID    GroupID     Last_Updated_time
----------------------------------------
1          345        5/26/2020 12:00pm
2          345        4/25/2020 12:00pm
3          234        4/25/2020 12:00pm

После

1          345        5/26/2020 12:00pm
2          345        5/26/2020 12:00pm
3          234        4/25/2020 12:00pm

Я подумал, что, возможно, смогу выполнить встроенный запрос в свой оператор обновления, как показано на один из ответов здесь Как ОБНОВИТЬ 1 строку с несколькими строками? , но я изо всех сил пытаюсь выяснить синтаксис, который гарантирует, что я обновляю только поле last_updated_time элементов с тем же GroupID.

Любая помощь будет принята с благодарностью. Использование SQL Server Express в приложении C#.

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Это может быть что-то вроде этого:

update ProductsTable
set Last_Updated_time = T.Last_Updated_time
from ProductsTable
    Inner Join 
       (select GroupID,  Max(Last_Updated_time) As Last_Updated_time
         from DataFeed
         group by GroupID) T
   on ProductsTable.GroupID = T.GroupID
0 голосов
/ 27 мая 2020

Если у вас большие таблицы, вы можете обнаружить, что apply дает лучшую производительность:

update pt
    set Last_Updated_time = df.Last_Updated_time
    from ProductsTable pt cross apply
         (select max(Last_Updated_time) As Last_Updated_time
          from DataFeed df
          where pt.GroupID = df.GroupID
         ) df;

Это может использовать преимущества индекса на datafeed(groupID, Last_Updated_time).

0 голосов
/ 27 мая 2020

Вы можете добиться того же, используя CTE

;WITH CTE AS 
(
    SELECT GROUPID,  MAX(LAST_UPDATED_TIME) AS LAST_UPDATED_TIME
    FROM DATAFEED
    GROUP BY GROUPID
)
UPDATE Z
SET LAST_UPDATED_TIME = T.LAST_UPDATED_TIME
FROM PRODUCTSTABLE Z
INNER JOIN CTE T ON PRODUCTSTABLE.GROUPID = T.GROUPID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...