当更新的表与源相同时,在 MS Access 中"Operation must use an updateable query"



挑战在于通过扫描同一个表来获取信息来更新表。在这种情况下,我想找出我在上传数据集中收到的具有相同键的条目(有效地重复指令)。

我尝试了明显的代码:

UPDATE Base AS TAR 
INNER JOIN (select cdKey, count(*) as ct FROM Base GROUP BY cdKey) AS CHK
ON TAR.cdKey = CHK.cdKey
SET ctReferences = CHK.ct

这会导致不可更新的投诉。一些变通方法讨论了添加DISTINCTROW,但这没有什么区别。

我尝试创建一个视图(查询在Ms/Access的说法);同样失败。

然后我投影集合(SELECT cdKey, count(*) INTO TEMP FROM Base GROUP BY cdKey),并将TEMP替换为INNER JOIN。

结论:反射性更新也是不可更新的。

最初的想法是在更新中嵌入子选择,例如:

UPDATE Base TAR SET TAR.ctReferences = (select count(*) from Base CHK where CHK.cd = TAR.cd)

这也失败了。

因为这是我正在调用的工作的一部分,这个SQL(像其他语句)都是由CurrentDb.Execute语句执行的字符串。我想也许我可以把它变成一个DLookup,我发现由于cd是一个字符串,我有一群双引号和三引号的元素,太混乱了,无法阅读(和维护)。

最好的解决方案是写一个函数,这样我就可以避免做任何类型的字符串操作。因此,在模块中有一个函数:

Public Function PassHelperCtOccurs(ByRef cdX As String) As Long
PassHelperCtOccurs = DLookup("count(*)", "Base", "cd='" & cdX & "'")

End Function

调用是:

CurrentDb().Execute ("UPDATE Base SET ctOccursCd =PassHelperCtOccurs(cd)")

相关内容

最新更新