Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL根据其中一行中的值更新多行_Sql_Sql Server_Sql Update_Sql Server 2016 Express - Fatal编程技术网

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

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的任何项目的

我有一个每天都在数据源上运行的进程,并更新数据源中库存数据库中所有项目的上次更新时间(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
,带有分号
正在教坏习惯。。。实际上,应该用
终止所有语句