使查询可更新
Posted
技术标签:
【中文标题】使查询可更新【英文标题】:Make a query updateable 【发布时间】:2015-11-17 20:16:45 【问题描述】:这是我在 MS Access 2007 中的不可更新查询:
SELECT [OnlineDirectory].BC_SPEC2
FROM [OnlineDirectory] INNER JOIN Certifs_ABMS
ON [OnlineDirectory].ThisID = Certifs_ABMS.ThisID;
OnlineDirectory
和 Certifs_ABMS
:
ThisID
上有索引(“可以重复”)。
查询
记录集类型为dynaset
。
没有记录锁。
这些都是可更新的:
SELECT * FROM [OnlineDirectory]
SELECT * FROM [Certifs_ABMS]
我已经查看了 Allen Browne 的 famous list of hazards,但没有一个适用。 更新:不正确。查看已接受的答案。
我很高兴按照建议的here 添加DISTINCTROW
,但没有成功。
如何使此查询可更新?
【问题讨论】:
这个可以更新吗?SELECT o.BC_SPEC2 FROM OnlineDirectory AS o WHERE o.ThisID IN (SELECT DISTINCT ThisID FROM Certifs_ABMS);
是的,这是可更新的。我读到了这种事情,但无法申请。我的 actual 查询有两个连接,这有点像我对 SQL 的深入了解所产生的头痛。不要抱怨。
如果 2 个字段而不仅仅是 ThisID
,那么 EXISTS
方法怎么样? SELECT o.BC_SPEC2 FROM OnlineDirectory AS o WHERE EXISTS (SELECT 1 FROM Certifs_ABMS AS c WHERE c.ThisID = o.ThisID AND c.OtherField = o.OtherField);
我发现“规范”表——没有收到更新的表——能够采用复合主键(这让我感到惊讶,我认为数据不够干净)。现在可以更新了。我相信@HansUp 的 SQL-fu 也可能是可行的,但我不确定我是否能够对其进行测试。
【参考方案1】:
OnlineDirectory 和 Certifs_ABMS 在 ThisID 字段上都有索引(“duplicates OK”)。
这就是问题所在。 INNER JOIN 的至少一侧需要唯一索引(通常是主键),否则关系不明确。
(Allen Browne:- JOIN 中的字段索引不正确:JOINed 字段上没有主键或唯一索引。)
例如如果两个表中都有两条记录,每条记录都带有ThisID = 77
。记录应该如何匹配?
如果这是 n:m 关系,则需要它们之间的联结表。
【讨论】:
以上是关于使查询可更新的主要内容,如果未能解决你的问题,请参考以下文章
我很困惑使用 coreml3 工具使 mlmodel 可更新
Access 2016 - 简单更新查询给出“操作必须使用可更新查询”错误