Обновление нескольких значений в одном выражении
У меня есть таблица 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. Вероятно, последнее. Может ли кто-нибудь помочь?
Ответы
Ответ 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'