访问:具有 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 个主键字段的可更新连接查询,这两个主键字段也是外键的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 如何创建一个新表,该表是两个现有表的主键的连接

从两个表中,把不同类型的字段查询连接在一起

Laravel 一对多关系与 2 个主键

没有主键知识的亚马逊 dynamodb 查询

SQL 更新查询

为啥 Snowflake 中这两个相似的查询具有非常不同的性能?