访问:具有2个主键字段的可更新连接查询,这两个主键字段也是外键

时间:2015-04-20 20:10:39

标签: sql ms-access ms-access-2007 ms-access-2010

在MS Access中,我正在尝试实现一个多对多表,该表将存储双向关系,类似于Association between two entries in SQL table。此表存储诸如“人员A和人员B是同事”,“C和D是朋友”等信息。表格如下:

ConstitRelationships

  • 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);

如果我忽略了我想要的成分II在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 个答案:

答案 0 :(得分:0)

我担心这是不可能的。因为您在查询中使用三个表中的连接,所以它不可更新。没有办法解决这个问题。

以下是有关该主题的一些详细信息:http://www.fmsinc.com/Microsoftaccess/query/non-updateable/index.html

如链接文章中所述,一种可能的解决方案,在我看来,最适合您的解决方案是临时表。与简单的“绑定形式到查询”方法相比,这是一项工作量,但它最有效。

另一种方法是以不需要连接的方式更改数据方案。但是,非规范化数据和重复数据将会发生横行,这使得临时表成为一个有利的选择。