Sql server 从子表列值更新父表列
我有一个SaleOrder(SO)和SaleOrderDetail(SOD)表,其中一个表与另一个表之间有关系。ID和SOID是主键外键。 在基于主键进行聚合之后,我需要使用SOD表的值更新SO表。 请看下面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
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”附近的语法不正确。