SQL根据其中一行中的值更新多行
我有一个每天都在数据源上运行的进程,并更新数据源中库存数据库中所有项目的上次更新时间(datetime字段)。我遇到的问题是,当一个项从数据源中删除时,它的最后更新时间不再由我的进程在数据库中更新。从数据源中删除一个项目后,只要存在与该项目共享同一项目组id(nvarchar)的项目,我仍然希望更新其上次更新时间 i、 e.如果数据库中确实存在一个项目,其上次更新时间由我的流程更新,并且该项目与数据源中不再存在的其他项目共享一个项目组id,我希望将其上次更新时间设置为共享该项目组id的任何项目的最近一次更新时间 出于这个问题的目的,我们讨论的是单个表中的所有列(实际的查询更复杂,但为了清晰起见,我将其缩减) 首先,它看起来像:SQL根据其中一行中的值更新多行,sql,sql-server,sql-update,sql-server-2016-express,Sql,Sql Server,Sql Update,Sql Server 2016 Express,我有一个每天都在数据源上运行的进程,并更新数据源中库存数据库中所有项目的上次更新时间(datetime字段)。我遇到的问题是,当一个项从数据源中删除时,它的最后更新时间不再由我的进程在数据库中更新。从数据源中删除一个项目后,只要存在与该项目共享同一项目组id(nvarchar)的项目,我仍然希望更新其上次更新时间 i、 e.如果数据库中确实存在一个项目,其上次更新时间由我的流程更新,并且该项目与数据源中不再存在的其他项目共享一个项目组id,我希望将其上次更新时间设置为共享该项目组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
我原以为我可以在我的update语句中执行一个嵌入式查询,如这里的一个答案所示,但我正在努力找出确保我只使用相同的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\u Updated\u time)
Pre-pending,带有分号代码>正在教坏习惯。。。实际上,应该用终止所有语句代码>。