SQL根据其中一条记录的值更新多条记录。

问题描述 投票:0回答:1

我有一个进程,每天在数据馈送上运行,并更新数据馈送中库存数据库中所有项目的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。

sql sql-server sql-update sql-server-2016-express
1个回答
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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.