31

我有一个主/明细表,并想根据明细表更新主表中的一些汇总值。我知道我可以像这样更新它们:

update MasterTbl set TotalX = (select sum(X) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID)
update MasterTbl set TotalY = (select sum(Y) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID)
update MasterTbl set TotalZ = (select sum(Z) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID)

但是,我想在一个声明中做到这一点,如下所示:

update MasterTbl set TotalX = sum(DetailTbl.X), TotalY = sum(DetailTbl.Y), TotalZ = sum(DetailTbl.Z)
from DetailTbl
where DetailTbl.MasterID = MasterTbl.ID group by MasterID

但这不起作用。我也尝试过省略“group by”子句的版本。我不确定我是否遇到了我的特定数据库 (Advantage) 的限制,或者我的 SQL 的限制。大概是后者。任何人都可以帮忙吗?

4

6 回答 6

29

尝试这个:

 Update MasterTbl Set
    TotalX = Sum(D.X),    
    TotalY = Sum(D.Y),    
    TotalZ = Sum(D.Z)
 From MasterTbl M Join DetailTbl D
    On D.MasterID = M.MasterID

根据您使用的数据库,如果这不起作用,那么试试这个(这是非标准 SQL,但在 SQL Server 中是合法的):

 Update M Set
    TotalX = Sum(D.X),    
    TotalY = Sum(D.Y),    
    TotalZ = Sum(D.Z)
 From MasterTbl M Join DetailTbl D
     On D.MasterID = M.MasterID
于 2008-11-14T02:55:47.817 回答
8

你为什么要在更新语句上进行分组?您确定这不是导致查询失败的部分吗?尝试这个:

update 
    MasterTbl
set
    TotalX = Sum(DetailTbl.X),
    TotalY = Sum(DetailTbl.Y),
    TotalZ = Sum(DetailTbl.Z)
from
    DetailTbl
where
    DetailTbl.MasterID = MasterID
于 2008-11-14T00:46:17.313 回答
4

在 Oracle 中,解决方案是:

UPDATE
    MasterTbl
SET
    (TotalX,TotalY,TotalZ) =
      (SELECT SUM(X),SUM(Y),SUM(Z)
         from DetailTbl where DetailTbl.MasterID = MasterTbl.ID)

不知道你的系统是否允许。

于 2008-11-14T13:06:56.490 回答
3

您是否尝试过对每个字段进行子查询:

UPDATE
    MasterTbl
SET
    TotalX = (SELECT SUM(X) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID),
    TotalY = (SELECT SUM(Y) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID),
    TotalZ = (SELECT SUM(Z) from DetailTbl where DetailTbl.MasterID = MasterTbl.ID)
WHERE
    ....
于 2008-11-14T01:56:09.590 回答
2

尝试这个:

update MasterTbl M,
       (select sum(X) as sX,
               sum(Y) as sY,
               sum(Z) as sZ,
               MasterID
        from   DetailTbl
        group by MasterID) A
set
  M.TotalX=A.sX,
  M.TotalY=A.sY,
  M.TotalZ=A.sZ
where
  M.ID=A.MasterID
于 2008-11-14T03:13:08.530 回答
1

如果您的数据库支持它,如果通过 LAN 查询,将所有 3 个更新连接到一个 sql 字符串将节省服务器往返行程。因此,如果没有其他工作,这可能会给您带来轻微的改善。典型的 'multi-statement delimiter 是分号,例如:

'update x....;update y...;update...z'
于 2010-05-04T21:13:32.537 回答