我有一个进程,每天在数据馈送上运行,并更新数据馈送中库存数据库中所有项目的last_update_time(一个日期时间字段)。 我遇到的问题是,当一个项目从datafeed中移除时,它的last_updated_time不再被我的进程更新到数据库中。 当一个项目从datafeed中移除后,我仍然希望它的last_update_time被更新,只要有一个项目与该项目共享相同的item_group_id(nvarchar)。
也就是说,如果数据库中确实存在一个项目,它的last_updated_time已经被我的进程更新了,并且它和其他项目共享一个项目组id,但这些项目在datafeed中已经不存在了,那么我希望它们的last_update_time被设置为任何共享该项目组id的项目的最近的last_update_time。
在这个问题中,我们讨论的是一个表中的所有列(实际查询比较复杂,但为了清楚起见,我已经缩小了范围)。
所以,开始的时候看起来是这样的。
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
我想我也许可以在我的更新语句中做一个嵌入式的查询,如这里的一个答案所示。如何在多行的情况下UPDATE 1行?但是我很难弄清楚确保我只更新具有相同GroupID的项目的last_updated_time字段的语法。
任何帮助都将是非常感激的。在C#应用程序中使用SQL Server Express。
它可能是这样的东西。
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
你可以通过使用 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
如果你有大桌子,你可能会发现,你会发现 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)
.