sql根据其中一行中的值更新多行

dba5bblo  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(480)

我有一个每天都在数据源上运行的进程,并更新数据源中库存数据库中所有项目的上次更新时间(datetime字段)。我遇到的问题是,当一个项从datafeed中删除时,它的上次更新时间不再由我的进程在数据库中更新。在从数据源中删除一个项之后,我仍然希望它的最后一次更新时间被更新,只要存在一个与该项共享同一个项组id(nvarchar)的项。
i、 e.如果数据源中确实存在一个项目,其上次\u更新\u时间由我的进程更新,并且该项目与数据源中不再存在的其他项目共享一个项目\u组\u id,我希望将其上次\u更新\u时间设置为共享该项目\u组\u id的任何项目的最新上次\u更新\u时间。
出于这个问题的目的,我们讨论的是单个表中的所有列(实际的查询更复杂,但为了清楚起见,我已经缩小了范围)。
首先,它看起来像:

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语句中执行一个嵌入式查询,如下面的一个答案所示:如何用多行更新一行?但我正在努力找出语法,以确保只更新具有相同groupid的项的最后一个\u updated \u时间字段。
任何帮助都将不胜感激。在c应用程序中使用sql server express。

ybzsozfc

ybzsozfc1#

可能是这样的:

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
daolsyd0

daolsyd02#

您可以通过使用 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

ttisahbt

ttisahbt3#

如果你有大table,你可能会发现 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) .

相关问题