MS Access 2016,加入多个表与复合键

问题描述:

早上好,MS Access 2016,加入多个表与复合键

我的第一个问题,所以赦免一些不良形式,如果存在。

我目前有三个表(table1,table2,table3),所有这些表都有一个复合主键(model-number,serial-number)。其意图在于将各方之间的序列号相关的数据拆分,其中一些数据比其他数据更有价值,这取决于谁在查看它。组合主键共享一对一关系,t1中的键与t2中的键相关,t2中的键与t3中的键相关。

我想写一个查询,从序列号的所有三个表中提取数据。我在印象之下做到这一点的最佳方式是使用INNER JOIN。该代码我有多远......

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], --placeholder for data columns 
    t2.[data], --placeholder for data columns 
    t3.[data] --placeholder for data columns 
FROM [table1] t1 
LEFT JOIN [table2] t2 
    ON t2.[model-number] = t1.[model-number] AND t2.[serial-number] = t1.[serial-number] 
LEFT JOIN [table3] t3 
    ON t3.[model-number] = t2.[model-number] AND t3.[serial-number] = t2.[serial-number] 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

然而,当我运行查询,MS访问给我的错误:

Syntax error (missing operator) in query expression "".

我试过到目前为止:

  1. T1的顺序相反。[模型数] = T2。[模型号]等...
  2. 添加/围绕T1/T2/T3别名卸下方括号
  3. 完全删除WHERE语句
  4. 将“AS”放在表别名标注的前面(即, LEFT JOIN [table1] AS t1)
  5. 减少所有数据,以便每个表中只有一个字段被引用(如果我在原始尝试中调出的30列中的某处出现明显的语法错误)

另外,在我解除错误之后,文本光标回到“t2。[”,在第一个LEFT JOIN的后半部分。

所有这一切说,我找不到语法错误。我错过了明显的东西吗?

在此先感谢!这个论坛真的帮助我建立这个数据库。

AC

每下面的评论,我删除了第二LEFT JOIN,因此代码阅读是这样的:

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], --placeholder for data columns 
    t2.[data], --placeholder for data columns 
FROM [table1] t1 
LEFT JOIN [table2] t2 
    ON t2.[model-number] = t1.[model-number] AND t2.[serial-number] = t1.[serial-number] 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

这导致查询来运行,所以有事情发生的两个左联接。我添加了第二LEFT JOIN回来....

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], --placeholder for data columns 
    t2.[data], --placeholder for data columns 
    t3.[data] 
FROM [table1] t1 
LEFT JOIN [table2] t2 
    ON t2.[model-number] = t1.[model-number] AND t2.[serial-number] = t1.[serial-number] 
LEFT JOIN [table3] t3 
    ON t3.[model-number] = t2.[model-number] AND t3.[serial-number] = t2.[serial-number] 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

....用SELECT语句从表一列,它给了我这个错误。在连续的JOIN子句之间是否有我缺少的语法?

+0

我想你需要一个'FROM'子句以及你要返回的字段之间的逗号。除非这只是你正在运行的一个片段... – Forty3

+0

在原来的文章中,我意外地输入了“GROUP BY”而不是“ORDER BY” - 我在代码示例中修复了这个问题。我的错。 – andrewec

+0

也是我的错!我在我的实际代码中有一个FROM子句和逗号 - 我将编辑帖子以反映它。 – andrewec

访问显然需要JOIN的是...我不知道这个词是什么(互斥也许):

SELECT 
    t1.[model-number], 
    t1.[serial-number], 
    t1.[track], 
    t1.[data], 
    t2.[data], 
    t3.[data] 
FROM (
     [table1] t1 
     LEFT JOIN [table2] t2 
      ON (t2.[model-number] = t1.[model-number]) 
      AND (t2.[serial-number] = t1.[serial-number]) 
    ) 
    LEFT JOIN [table3] t3 
     ON (t3.[model-number] = t2.[model-number]) 
     AND (t3.[serial-number] = t2.[serial-number]) 
WHERE t1.[track] = TRUE 
ORDER BY t1.[model-number], t1.[serial-number] DESC; 

注意额外的括号T1和T2之间的连接?似乎有必要。

注 - 我发现的方式是使用连接组合键上的表的查询设计窗口,并将属性更改为LEFT(即左表中的所有行和只匹配右表中的行),然后看着生成的SQL。

+0

顺便说一句:一定要删除以'--'开头的注释,因为Access不喜欢那些。 – Forty3

+0

感谢您的额外评论。我的访问代码中没有他们,在我的尝试中早些时候遇到了这个错误:)括号似乎工作!我想我明白那里发生了什么,但我会继续尝试一些其他的问题,我必须写。下一步是加入另一张桌子......希望同样的技术能够发挥作用。 – andrewec