MS Access 2016,使用复合键连接多个表

MS Access 2016, joining multiple tables with composite keys

大家早上好,

我的第一个问题,请原谅一些错误的形式。

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

我正在尝试编写一个查询,按序列号从所有三个 table 中提取数据。我的印象是最好的方法是使用 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 Access 给我错误:

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

到目前为止我尝试过的:

  1. t1.[model-number] = t2.[model-number] 等的倒序...
  2. Adding/Removing 方括号 t1/t2/t3 别名
  3. 完全删除 WHERE 语句
  4. 将 "AS" 放在 table 别名标注前面(即 LEFT JOIN [table1] AS t1)
  5. 减少所有数据,以便每个 table 中只有一个字段被引用(以防我错过了我在最初尝试中调用的 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 语句中 table 的一列,它给了我那个错误。连续的 JOIN 子句之间是否缺少语法?

Access 显然要求 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 之间连接周围的额外括号了吗?好像有必要。

注意 - 我发现这一点的方法是使用查询设计 window 在它们的复合键上加入 tables 并将属性更改为 LEFT(即从左边开始的所有行 table 并且只匹配右边的行 table) 然后查看生成的 SQL。

我想这 every-join-a-paranthesis 事情背后的逻辑主要是每次加入你 "create" 一个你想加入的新 table。我想这主要是一个范围的事情,访问总是需要 JOIN 子句左侧的一个对象 table/[括号包围的查询]。一旦您知道您可以毫无问题地加入 5 或 7 个 table。对于 INNER JOIN 之外的任何其他内容,它们都是必需的。