En algunas consultas de Microsoft Access, recibo el siguiente mensaje: La operación debe utilizar una consulta actualizable. (Error 3073). Lo resuelvo utilizando tablas temporales, pero me pregunto si hay una forma mejor. Todas las tablas implicadas tienen una clave primaria. Este es el código:
UPDATE CLOG SET CLOG.NEXTDUE = (
SELECT H1.paidthru
FROM CTRHIST as H1
WHERE H1.ACCT = clog.ACCT AND
H1.SEQNO = (
SELECT MAX(SEQNO)
FROM CTRHIST
WHERE CTRHIST.ACCT = Clog.ACCT AND
CTRHIST.AMTPAID > 0 AND
CTRHIST.DATEPAID < CLOG.UPDATED_ON
)
)
WHERE CLOG.NEXTDUE IS NULL;
Desde Jet 4, todas las consultas que tienen un join a una sentencia SQL que resume datos serán no actualizables. Usted no está usando un JOIN, pero la cláusula WHERE es exactamente equivalente a un join, y por lo tanto, el optimizador de consultas de Jet la trata de la misma manera que a un join.
Me temo que no tendrá suerte sin una tabla temporal, aunque quizás alguien con más conocimientos de Jet SQL que yo pueda encontrar una solución.
Por cierto, puede que fuera actualizable en Jet 3.5 (Access 97), ya que entonces había un montón de consultas actualizables que dejaron de serlo al actualizar a Jet 4.
--
El problema está relacionado con el uso de (en este caso) la función max(). Cualquier función de agregación utilizada durante una unión (por ejemplo, para recuperar el valor máximo, mínimo o medio de una tabla unida) provocará el error. Y lo mismo se aplica al uso de subconsultas en lugar de uniones (como en el código original).
Esto es increíblemente molesto (¡e injustificado!) ya que es algo razonablemente común querer hacer. También he tenido que usar tablas temporales para evitarlo (extraer el valor agregado a una tabla temporal con una sentencia insert, luego unir a esta tabla con la actualización, y luego eliminar la tabla temporal).
Glenn
En esencia, aunque tu SQL parece perfectamente razonable, Jet nunca ha soportado la sintaxis estándar de SQL para UPDATE
. En su lugar, utiliza su propia sintaxis propietaria (diferente de nuevo de la sintaxis propietaria "Update" de SQL Server) que es muy limitada. A menudo, las únicas soluciones "La operación debe utilizar una consulta actualizable" son muy dolorosas. Considere seriamente la posibilidad de cambiar a un producto SQL más capaz.
Para más detalles sobre sus problemas específicos y algunas posibles soluciones, vea Update Query Based on Totals Query Fails.