【问题标题】: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;

OnlineDirectoryCertifs_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 也可能是可行的,但我不确定我是否能够对其进行测试。

标签: sql ms-access


【解决方案1】:

OnlineDirectory 和 Certifs_ABMS 在 ThisID 字段上都有索引(“duplicates OK”)。

这就是问题所在。 INNER JOIN 的至少一侧需要唯一索引(通常是主键),否则关系不明确。

(Allen Browne:- JOIN 中的字段索引不正确:JOINed 字段上没有主键或唯一索引。

例如如果两个表中都有两条记录,每条记录都带有ThisID = 77。记录应该如何匹配?

如果这是 n:m 关系,则需要它们之间的联结表。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多