usuario - funciones sql pdf
Actualizar múltiples valores en una sola declaración (6)
¿Has probado con una sub consulta para cada campo?
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
....
Tengo una tabla maestra / detalle y quiero actualizar algunos valores de resumen en la tabla maestra con la tabla de detalles. Sé que puedo actualizarlos así:
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)
Pero, me gustaría hacerlo en una sola declaración, algo como esto:
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
pero eso no funciona. También probé versiones que omiten la cláusula "agrupar por". No estoy seguro de si estoy tropezando con los límites de mi base de datos particular (Ventaja) o los límites de mi SQL. Probablemente el último. ¿Alguien puede ayudar?
¿Por qué haces un grupo en una declaración de actualización? ¿Estás seguro de que esa no es la parte que está causando que la consulta falle? Prueba esto:
update
MasterTbl
set
TotalX = Sum(DetailTbl.X),
TotalY = Sum(DetailTbl.Y),
TotalZ = Sum(DetailTbl.Z)
from
DetailTbl
where
DetailTbl.MasterID = MasterID
En Oracle la solución sería:
UPDATE
MasterTbl
SET
(TotalX,TotalY,TotalZ) =
(SELECT SUM(X),SUM(Y),SUM(Z)
from DetailTbl where DetailTbl.MasterID = MasterTbl.ID)
No sé si tu sistema permite lo mismo.
Prueba esto:
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
Si su DB lo admite, la concatenación de las 3 actualizaciones en una cadena sql se guardará en los viajes de ida y vuelta del servidor si se realiza una consulta a través de la LAN. Entonces, si nada funciona, esto podría darle una ligera mejoría. El delimitador de sentencias múltiples típico es el punto y coma, por ejemplo:
''update x....;update y...;update...z''
Prueba esto:
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
Dependiendo de la base de datos que esté utilizando, si eso no funciona, intente esto (esto es SQL no estándar pero legal en 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