访问:具有 2 个主键字段的可更新连接查询,这两个主键字段也是外键
Posted
技术标签:
【中文标题】访问:具有 2 个主键字段的可更新连接查询,这两个主键字段也是外键【英文标题】:Access: Updatable join query with 2 primary key fields that are both also foreign keys 【发布时间】:2015-04-20 20:10:39 【问题描述】:在 MS Access 中,我正在尝试实现一个多对多表,该表将存储 2 向关系,类似于 Association between two entries in SQL table。该表存储诸如“A和B是同事”“C和D是朋友”等信息。表是这样的:
宪法关系
LeftId(Constituents.ConstitId 的数字、主键、外键) RightId(Constituents.ConstitId 的数字、主键、外键) 说明(文字)请注意,主键是两个 Id 字段的组合。 该表也有约束:
[LeftId]<>[RightId] AND [LeftId]<[RightId]
该表在我的 Access 项目中工作正常,除了我不知道如何制作一个我想用作数据表子表单的 可更新 查询,以便用户可以轻松添加/删除记录和更改描述。我目前有一个不可更新的查询:
SELECT Constituents.ConstituentId, Constituents.FirstName,
Constituents.MiddleName, Constituents.LastName,
ConstitRelationships.Description, ConstitRelationships.LeftId,
ConstitRelationships.RightId
FROM ConstitRelationships INNER JOIN Constituents ON
(Constituents.ConstituentId =
ConstitRelationships.RightId) OR (Constituents.ConstituentId =
ConstitRelationships.LeftId);
如果我忽略了我想要的成分 ID 在 leftId 列中的可能性,我可以这样做,它 是 可更新的。所以上面的内部连接中的OR
条件搞砸了。
SELECT Constituents.ConstituentId, Constituents.FirstName,
Constituents.MiddleName, Constituents.LastName,
ConstitRelationships.Description, ConstitRelationships.LeftId,
ConstitRelationships.RightId
FROM ConstitRelationships INNER JOIN Constituents ON
(Constituents.ConstituentId =
ConstitRelationships.RightId) ;
我还尝试了这个古怪的 iif 方法,将两个 LeftId 和 RightId 字段折叠到 FriendId 中,但它也无法更新。
SELECT Constituents.ConstituentId, Constituents.FirstName,
Constituents.MiddleName,
Constituents.LastName, subQ.Description
FROM Constituents
INNER JOIN (
SELECT Description, Iif([Forms]![Constituents Form]![ConstituentId] <>
ConstitRelationships.LeftId, ConstitRelationships.LeftId,
ConstitRelationships.RightId) AS FriendId
FROM ConstitRelationships
WHERE ([Forms]![Constituents Form]![ConstituentId] =
ConstitRelationships.RightId)
OR ([Forms]![Constituents Form]![ConstituentId] =
ConstitRelationships.LeftId)
) subQ
ON (subQ.FriendId = Constituents.ConstituentId)
;
如何对 ConstitRelationships 进行可更新查询,包括使用 Constituent.FirstName MiddleName LastName 字段的 JOIN?
【问题讨论】:
【参考方案1】:恐怕这是不可能的。因为您在查询中对三个表使用连接,所以它是不可更新的。没有办法解决这个问题。
这里有一些关于该主题的详细信息:http://www.fmsinc.com/Microsoftaccess/query/non-updateable/index.html
如链接文章中所述,一种可能的解决方案,我认为最适合您的解决方案是临时表。与简单的“将表单绑定到查询”方法相比,这是一项繁重的工作,但效果最好。
另一种方法是以不需要联接的方式更改您的数据方案。但随后非规范化数据和重复数据会大行其道,这使得临时表成为一个有利的选择。
【讨论】:
我阅读了链接,但我不确定临时表如何工作。如果用户对临时表进行更改(更新和删除),这些更改将如何提交回 ConstitRelationships? 您必须自己编写这些程序。例如,在 AfterUpdate_Event 上,您执行将字段保存到原始表的更新查询。这就是我所说的“工作量”。以上是关于访问:具有 2 个主键字段的可更新连接查询,这两个主键字段也是外键的主要内容,如果未能解决你的问题,请参考以下文章