如何在SQL中左键联接4个表?

如何在SQL中左键联接4个表?,sql,ms-access,Sql,Ms Access,我有4个表格-控制、风险、流程和法规。它们每个都有ID号的通用实例。例如,ID1存在于4个表中。问题在于,在每个表下,每个ID的实例数量因ex而异,ID1在控制中存在5次,在风险中存在3次,在流程中存在0次,在法规中存在一次 我需要左键联接所有这些表,以便它们都通过ID号联接 下面的代码一直工作到第3行,但是当我添加第4行时,它给了我一个结果表,不允许有多个自动编号字段错误 SELECT * FROM Controls LEFT JOIN Processes ON Processes.T

我有4个表格-控制、风险、流程和法规。它们每个都有ID号的通用实例。例如,ID1存在于4个表中。问题在于,在每个表下,每个ID的实例数量因ex而异,ID1在控制中存在5次,在风险中存在3次,在流程中存在0次,在法规中存在一次

我需要左键联接所有这些表,以便它们都通过ID号联接

下面的代码一直工作到第3行,但是当我添加第4行时,它给了我一个结果表,不允许有多个自动编号字段错误


SELECT * 

FROM Controls

LEFT JOIN Processes ON Processes.TO_PRC_ID = Controls.TO_PRC_ID

LEFT JOIN Risks ON Risks.TO_PRC_ID = Controls.TO_PRC_ID

LEFT JOIN Regulations ON Regulations.TO_PRC_ID = Controls.TO_PRC_ID


MS Access需要多个连接的额外括号:

SELECT * 
FROM (Controls LEFT JOIN
      Processes_Risks
      ON Processes_Risks.TO_PRC_ID = Controls.TO_PRC_ID
     ) LEFT JOIN
     Issues
     ON Issues.TO_PRC_ID = Controls.TO_PRC_ID
这个过程还在继续:

SELECT * 
FROM ((Controls LEFT JOIN
       Processes_Risks
       ON Processes_Risks.TO_PRC_ID = Controls.TO_PRC_ID
      ) LEFT JOIN
      Issues
      ON Issues.TO_PRC_ID = Controls.TO_PRC_ID
     ) LEFT JOIN
     Regulations
     ON . . .

您有两个或多个具有相同列名的表,因此请尝试在“选择”中使用完全限定列名

SELECT c.TO_PRC_ID, p.TO_PRC_ID, r1.TO_PRC_ID, r2.TO_PRC_ID
FROM Controls c 
LEFT JOIN Processes ON  p p.TO_PRC_ID = c.TO_PRC_ID
LEFT JOIN Risks r1 ON r1.TO_PRC_ID = c.TO_PRC_ID
LEFT JOIN Regulations r2 ON r2.TO_PRC_ID = c.TO_PRC_ID

这里有两个不同的问题。一个问题是获取连接四个表的正确语法。另一个问题是错误消息结果表不允许有多个自动编号字段

我没有要联接的表的副本,但我怀疑其中不止一个表中有“自动编号”字段。这是一个字段,在向表中添加新记录时自动生成记录编号。因为左联接包含所有表中的所有字段,所以它最终将包含两个不同的自动编号字段。MS Access无法处理这种情况,因此它声明存在错误

从联接中删除自动编号字段的正确但困难的方法是列出所有其他字段。因此,与其

FROM CONTROLS
人们需要编写代码

FROM (SELECT A, B, C, D, WHATEVER FROM CONTROLS)
以消除问题字段


如果表中有许多字段,那么编写代码就变得单调乏味。另一种方法是将表复制到临时表中,从副本中删除“自动编号”字段,并在联接中使用副本而不是原始副本。这是一个好主意还是坏主意取决于具体情况,例如表有多大,需要多长时间执行一次,以及是否有一个好方法可以在以后清理临时表。

如果我想在Regulations.to_PRC_ID=Controls.to_PRC_ID上添加第三个join LEFT join Regulations,我将把这些偏执放在哪里