2

我有一个每天在数据馈送上运行的进程,并更新我们库存数据库中存在于数据馈送中的所有项目的 last_update_time (日期时间字段)。我遇到的问题是,当一个项目从数据源中删除时,它的 last_updated_time 不再由我的进程在数据库中更新。从数据馈送中删除项目后,只要存在与该项目共享相同 item_group_id (nvarchar) 的项目,我仍然希望更新其 last_update_time。

即,如果数据库中确实存在一个项目,其 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 行?,但我正在努力找出确保我只更新具有相同 GroupID 的项目的 last_updated_time 字段的语法。

任何帮助将不胜感激。在 C# 应用程序中使用 SQL Server Express。

4

3 回答 3

1

它可能是这样的:

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
于 2020-05-27T04:23:31.293 回答
0

您可以通过使用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
于 2020-05-27T04:29:25.653 回答
0

If you have large tables, you might find that apply gives the best performance:

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;

This can take advantage of an index on datafeed(groupID, Last_Updated_time).

于 2020-05-27T12:07:52.953 回答