MS Access表与多个外键在同一表中的关系。

最后发布: 2020-08-03


问题

我在 MS Access 中有一个表,其中有 4 列,它们都包含一个 ID,这个 ID 是另一个表的主键,我想知道是否有其他方法可以做到这一点,如果没有,我如何让 Access 让我连接这些表,而不会出现错误,即它无法知道我试图连接的是什么。 差不多这些id是学生表的一部分,它们包含了他们的主管在该区块的id,有4个区块,我需要能够跟踪每个主管在每个区块有哪些学生。

主管表。

CREATE TABLE supervisors 
( id NUMBER primary key
, last_name TEXT
, first_name TEXT
, mi TEXT
, m_number TEXT
, email HYPERLINK
, status TEXT
, notes MEMO
) ;

学生表:

CREATE TABLE students 
( id NUMBER primary key
, last_name TEXT
, first_name TEXT
, mi TEXT
, m_number TEXT
, email HYPERLINK
, blk1_supervisor_id NUMBER
, blk2_supervisor_id NUMBER
, blk3_supervisor_id NUMBER
, blk4_supervisor_id NUMBER
) ;

我不能让它让我把blk1, 2, 3, 4字段的外键加入到主管表中 更不用说同时加入blk1_supervisor_id和blk2_supervisor_id了。

sql ms-access-2010
回答

你可以保持你的Supervisors表现在的样子,有一个学生表,只有真正的学生属性(到电子邮件).然后你创建一个学生Supervisor关系表。

CREATE TABLE StudentsSupervisors 
( StudentId NUMBER 
  SupervisorId Number )

其中两个字段构成PK。如果您需要进一步确定关系,您可以在表中添加 blockNumber 的表,并最终将其包含在PK中,如果同一个SuperVisor可以在不同的区块中两次链接到同一个学生。


回答

在不知道你的表模式的情况下,这是我能为你做的最好的事情......。

SELECT SV.Name, S.Name, SB.Block
FROM Students as S

   INNER JOIN Student_Blocks AS SB
   ON S.StudentID = SB.StudentID

   INNER JOIN Supervisors AS SV
   ON SB.Block1SupervisorID = SV.SupervisorID
   AND SB.Block2SupervisorID = SV.SupervisorID
   AND SB.Block3SupervisorID = SV.SupervisorID
   AND SB.Block4SupervisorID = SV.SupervisorID

ORDER BY SB.Block


回答

一个快速而简单的方法来正确规范你的表。从下面的每个语句中选择一个选项.一个学生可以有nononemany主管.一个主管可以有nononemany学生.在你的情况下,一个学生可以有很多主管,一个主管可以有很多学生。因此,学生和主管之间的关系是many-many,这在RDBMS中是不允许的。在这种情况下,你必须在两者之间创建一个连接表,就像Patrick Honorez向你展示的那样。