具有聚合函数的SQL Update查询

时间:2016-02-10 08:30:08

标签: sql-server sql-update aggregate

我有2个表,如:

CREATE TABLE [dbo].[Inventory](
[ID] [int] IDENTITY(1,1) NOT NULL
[SerialNo] [nvarchar](50) NOT NULL,
[Quantity] [decimal](12, 3) NULL)

CREATE TABLE [dbo].[InventoryDetails](
[ID] [int] IDENTITY(1,1) NOT NULL,
[InventoryID] [int] NOT NULL,
[ProductID] [int] NOT NULL,
[Quantity] [decimal](10, 3) NOT NULL)

我想执行以下查询:

Update I set Quantity=Sum(ID.Quantity)
from Inventory I
Inner Join inserted ID on I.ID=ID.InventoryID

SQL Server出现此错误: An aggregate may not appear in the set list of an UPDATE statement.

这样做的真正方法是什么?我是否需要按条款分组?

2 个答案:

答案 0 :(得分:3)

我认为代码用在InventoryDe​​tails表的触发器中(因为它使用特殊的inserted表)。在问题中指定它会很好。

这是SQL Server的限制。可以使用子查询来克服它。

UPDATE I SET Quantity=ID.Sum_Quantity
FROM Inventory I
INNER JOIN (SELECT InventoryID, SUM(Quantity) AS Sum_Quantity 
            FROM inserted GROUP BY InventoryID) ID ON I.ID=ID.InventoryID

答案 1 :(得分:0)

我修改了一下你的更新sql脚本,我认为应该是这样的:

update Inventory as I
set I.Quantity = (select sum(ID.Quantity) from InventoryDetails as ID)
where I.ID = (select IDS.ID from InventoryDetails as IDS where IDS.ID = I.ID)

一点解释:

  

从InventoryDe​​tails中选择sum(ID.Quantity)作为ID

此选择会执行您想要的聚合。

  

其中I.ID =(从InventoryDe​​tails中选择IDS.ID作为IDS,其中IDS.ID   = I.ID)

模拟您的内部联接。 (如果我错了,请在此纠正我,谢谢)。