Sql server 从子表列值更新父表列

Sql server 从子表列值更新父表列,sql-server,while-loop,inner-join,parent-child,aggregate-functions,Sql Server,While Loop,Inner Join,Parent Child,Aggregate Functions,我有一个SaleOrder(SO)和SaleOrderDetail(SOD)表,其中一个表与另一个表之间有关系。ID和SOID是主键外键。 在基于主键进行聚合之后,我需要使用SOD表的值更新SO表。 请看下面 SO ----------------------------------- ID SaleOrderQty 1 -- 2 -- SOD ------------------------------------- SOID Qty PerPack 1 3

我有一个SaleOrder(SO)和SaleOrderDetail(SOD)表,其中一个表与另一个表之间有关系。ID和SOID是主键外键。 在基于主键进行聚合之后,我需要使用SOD表的值更新SO表。 请看下面

SO
-----------------------------------
ID  SaleOrderQty
1   --
2   --

SOD
-------------------------------------
SOID    Qty PerPack
1       3   10
1       7   6
2       4   5
2       5   8
将数量乘以每个包装

1   3*10 = 30
1   7*6 = 42
2   4*5 = 20
2   5*8 = 40
并根据键将所有乘法结果相加

1   30+42 = 72
2   20+40 = 60
并更新父表

SO
-----------------------------------
ID  SaleOrderQty
1   72
2   60
我试过这个

Declare @Id varchar(50)
declare @Next int
set @Next =1
WHILE @Next <= 30
Begin
    Select @Id = Id From SO Where SOSerial=@Next

    Update SO 
    Set SaleOrderQty = (SELECT  sum((SOD.Quantity* SOD.PerPack)) total
                        FROM  SO INNER JOIN
                        SOD ON SO.Id = SOD.SOId
                        WHERE SOD.SOId=@Id
                        group by SOD.SOId)


                        set @Next=@Next+1
                        --print @Id
End
Declare@Id varchar(50)
声明@Next int
设置@Next=1

虽然@Next符合我之前的评论,但您希望避免循环

update so
set SaleOrderQty = a.calc
from SO so
join (select sod.soid,sum((SOD.Quantity* SOD.PerPack)) as calc
        from sod
        group by sod.SOID) a on a.SOID=so.ID

where so.SaleOrderQty is null --optional

关键点:
使用join更新
。谷歌关于它。你想用一个集合和一个循环来做这件事不需要在这里使用循环。这应该是一条update语句。错误:集合可能不会出现在update语句的集合列表中。添加group by后,仍然错误:关键字“group”附近的语法不正确。