Подтвердить что ты не робот

Обновление нескольких значений в одном выражении

У меня есть таблица master/detail и вы хотите обновить некоторые итоговые значения в главной таблице в таблице подробностей. Я знаю, что могу обновить их следующим образом:

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. Вероятно, последнее. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Попробуйте следующее:

 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

Ответ 2

Почему вы делаете группу в операторе обновления? Вы уверены, что не та часть, которая вызвала запрос? Попробуйте следующее:

update 
    MasterTbl
set
    TotalX = Sum(DetailTbl.X),
    TotalY = Sum(DetailTbl.Y),
    TotalZ = Sum(DetailTbl.Z)
from
    DetailTbl
where
    DetailTbl.MasterID = MasterID

Ответ 3

В Oracle решение будет:

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

Не знаю, поддерживает ли ваша система то же самое.

Ответ 4

Вы пробовали с подзапросом для каждого поля:

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
    ....

Ответ 5

Попробуйте следующее:

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

Ответ 6

Если ваша БД поддерживает его, объединение всех трех обновлений в одну строку sql будет экономить на серверах-round-trip при запросе по локальной сети. Поэтому, если ничего не работает, это может дать вам небольшое улучшение. Типичным "разделителем нескольких операторов" является точка с запятой, например:

'update x....;update y...;update...z'