La operación debe utilizar una consulta actualizable. (Error 3073) Microsoft Access

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;
Solución

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.

--

Comentarios (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

Comentarios (0)

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.

Comentarios (0)