valores usuario tipos tabla por funciones examples ejemplos definidas create con basicas sql advantage-database-server

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