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」句を省略したバージョンも試しました。特定のデータベースの制限 (アドバンテージ) にぶつかっているのか、それとも 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ステートメントでgroup byを実行しているのはなぜですか? クエリが失敗する原因となっているのはその部分ではありませんか? これを試して:

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

DB がサポートしている場合、3 つの更新すべてを 1 つの SQL 文字列に連結すると、LAN 経由でクエリを実行する場合にサーバーのラウンドトリップを節約できます。したがって、他に何も機能しない場合は、これによりわずかな改善が得られる可能性があります. 典型的な '複数ステートメントの区切り文字はセミコロンです。例:

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