当前位置:  开发笔记 > 编程语言 > 正文

操作必须使用可更新的查询.(错误3073)Microsoft Access

如何解决《操作必须使用可更新的查询.(错误3073)MicrosoftAccess》经验,为你挑选了2个好方法。

在某些Microsoft Access查询中,我收到以下消息:操作必须使用可更新的查询.(错误3073).我通过使用临时表来解决它,但我想知道是否有更好的方法.涉及的所有表都有一个主键.这是代码:

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;

David-W-Fent.. 23

从Jet 4开始,所有连接到汇总数据的SQL语句的查询都是不可更新的.您没有使用JOIN,但WHERE子句与连接完全等效,因此,Jet查询优化器将其视为处理连接的方式.

如果没有临时表,我担心你会失去运气,不过可能有一些人拥有更强的Jet SQL知识而不是我可以想出一个解决方法.

顺便说一句,它可能在Jet 3.5(Access 97)中可以更新,因为很多查询都是可更新的,然后在升级到Jet 4时变得不可更新.

-



1> David-W-Fent..:

从Jet 4开始,所有连接到汇总数据的SQL语句的查询都是不可更新的.您没有使用JOIN,但WHERE子句与连接完全等效,因此,Jet查询优化器将其视为处理连接的方式.

如果没有临时表,我担心你会失去运气,不过可能有一些人拥有更强的Jet SQL知识而不是我可以想出一个解决方法.

顺便说一句,它可能在Jet 3.5(Access 97)中可以更新,因为很多查询都是可更新的,然后在升级到Jet 4时变得不可更新.

-


我不相信你断言你引用的SQL可能会在Jet中产生"查询过于复杂"的错误.你错了,或者由于某些原因我无法理解,传播关于Jet的错误信息.

2> 小智..:

我有一个类似的问题,以下查询不起作用;

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = (select LGA.LGA_NAME from tbl_Prop_LGA as LGA where LGA.LGA_CODE = LVD.LGCode)
where LVD.LGAName is null;

update tbl_LOT_VALUATION_DETAILS inner join tbl_prop_LGA on tbl_LOT_VALUATION_DETAILS.LGCode = tbl_prop_LGA.LGA_CODE 
set tbl_LOT_VALUATION_DETAILS.LGAName = [tbl_Prop_LGA].[LGA_NAME]
where tbl_LOT_VALUATION_DETAILS.LGAName is null;

但是使用DLookup解决了这个问题;

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = dlookup("LGA_NAME", "tbl_Prop_LGA", "LGA_CODE="+LVD.LGCode)
where LVD.LGAName is null;

此解决方案最初是在/sf/ask/17360801/中提出的.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有