挑战在于通过扫描同一个表来获取信息来更新表。在这种情况下,我想找出我在上传数据集中收到的具有相同键的条目(有效地重复指令)。
我尝试了明显的代码:
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)")