Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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 Server仅更新组中的最新记录_Sql_Sql Server_Sql Server 2008 R2_Sql Update - Fatal编程技术网

SQL Server仅更新组中的最新记录

SQL Server仅更新组中的最新记录,sql,sql-server,sql-server-2008-r2,sql-update,Sql,Sql Server,Sql Server 2008 R2,Sql Update,我使用的是SQL Server 2008 R2,我有两个表Product和Product\u Master。我只想从Product表中更新Product\u Master中记录的最新版本,保留早期版本不变 CREATE TABLE [dbo].[Product] ( [ProdId] [nvarchar](50) NOT NULL, [ProdDesc] [nvarchar](50) NULL, [ProdPrice] [decimal](18, 0) NULL,

我使用的是SQL Server 2008 R2,我有两个表
Product
Product\u Master
。我只想从
Product
表中更新
Product\u Master
中记录的最新版本,保留早期版本不变

CREATE TABLE [dbo].[Product]
(
    [ProdId] [nvarchar](50) NOT NULL,
    [ProdDesc] [nvarchar](50) NULL,
    [ProdPrice] [decimal](18, 0) NULL,
    [Version] [int] NOT NULL
) ON [PRIMARY]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Product_Master]
(
    [ProdId] [nvarchar](50) NOT NULL,
    [ProdDesc] [nvarchar](50) NULL,
    [ProdPrice] [decimal](18, 0) NULL,
    [Version] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO [dbo].[Product] ([ProdId], [ProdDesc], [ProdPrice], [Version]) 
VALUES (N'1001', N'Toys', CAST(2500 AS Decimal(18, 0)), 2),
       (N'1002', N'Books', CAST(1800 AS Decimal(18, 0)), 3)
GO

INSERT INTO [dbo].[Product_Master] ([ProdId], [ProdDesc], [ProdPrice], [Version]) 
VALUES (N'1001', N'Toys', CAST(2500 AS Decimal(18, 0)), 2),
       (N'1001', N'Toys', CAST(2000 AS Decimal(18, 0)), 1),
       (N'1002', N'Perfumes', CAST(1500 AS Decimal(18, 0)), 1),
       (N'1002', N'Perfumes', CAST(1500 AS Decimal(18, 0)), 2),
       (N'1002', N'Perfumes', CAST(1800 AS Decimal(18, 0)), 3)
GO
为了更好地理解,附上了图片


根据您共享的图像,可以在两个表之间使用简单的
内部联接来更新主表中的价格

Update PMT
SET PMT.ProdPrice = PT.ProdPrice
From prod_master_table PMT
INNER JOIN Product_Table PT On PT.ProdId = PMT.ProdId and PMT.Version = PT.Version 

我不确定您是否打算在
产品
表中包含
版本
。如果要匹配它们,只需基于
内部连接进行简单的
更新

您的问题似乎表明您想用
产品
表中的内容更新最新记录。如果是这种情况,则使用CTE和
合并

; WITH cte (ProdID, ProdDesc, ProdPrice, Version) AS (
  SELECT ProdID, ProdDesc, ProdPrice, Version
  FROM (
    SELECT ProdID, ProdDesc, ProdPrice, Version
       , ROW_NUMBER() OVER (PARTITION BY ProdID ORDER BY Version DESC) AS rn 
    FROM Product_Master
  )s1
  WHERE rn= 1
)
MERGE INTO cte AS tgt
USING Product AS src
ON tgt.ProdID = src.ProdID
WHEN MATCHED
THEN
  UPDATE
  SET tgt.ProdPrice = src.ProdPrice
    , tgt.Version = src.Version
;
========================================

EDIT:OP EDIT应该是一条评论。


非常感谢您的努力和支持Shawn。很少有疑问

Q1)是否可以使用CTE创建存储过程

我不明白为什么会这样。该代码可能是存储过程的理想选择。

问题2)是否可以扩展CTE以更新多个表

例如,产品表中有一些名为“供应商名称”的附加列,是否可以在更新产品主数据的同时更新其他表(如“供应商详细信息”)中的这些列_


A2)我看不到你的照片,所以我不知道它是否为你的原始帖子添加了额外的细节。根据您尝试执行的操作,您可以将其推进相同的存储过程,或者调用不同的存储过程进行修改。稍后我将尝试查看图像。

使用CTE选择您想要的记录,然后更新CTE。非常感谢您的努力和支持Shawn。@raajesh对于您的其他问题,我不确定您想做什么。您可能不想从原始查询中更新两个不相关的表。您可能需要创建一个新问题,该问题包含您尝试执行的整个工作流程。合并可以完成很多你想要的东西,但它可能不是实现你最终目标的合适功能。谢谢Shawn,Q1我能做到。关于第二季度。更改了需求,这就是为什么我不能更早地定义它。我很快会给你表格的脚本。肖恩,我在下面的链接上打开了一个新问题。如果可以,请帮忙