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

时间:2017-08-04 17:58:41

标签: sql inner-join multiple-tables composite-primary-key ms-access-2016

早上好,

我的第一个问题,如果它存在,请原谅一些不好的形式。

我目前有三个表(table1,table2,table3),所有表都有一个复合主键(型号,序号)。目的是分割与各方之间的序列号有关的数据,其中一些数据比其他数据更有价值,具体取决于谁在看它。复合主键共享一对一关系,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 Access会给出错误:

  

查询表达式中的语法错误(缺少运算符)""。

到目前为止我已尝试过:

  1. t1的逆序。[型号] = t2。[型号]等......
  2. 在t1 / t2 / t3别名
  3. 周围添加/删除方括号
  4. 完全删除WHERE语句
  5. 投入" AS"在表别名标注前面(即LEFT JOIN [table1] AS t1)
  6. 减少所有数据,以便只引用每个表中的一个字段(如果我错过了原始尝试中调用的30列中某处的明显语法错误)
  7. 此外,在我解除错误后,文本光标返回到" 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子句之间是否缺少语法?

2 个答案:

答案 0 :(得分:1)

访问显然需要JOINs ...我不知道这个词是什么(互相排斥):

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。

答案 1 :(得分:0)

我猜想,这种“每一个联接到一个括号”事件背后的逻辑主要是,对于每个联接,您都“创建”一个要联接的新表。我猜这主要是一个范围问题,访问总是要在JOIN子句的左边保留一个对象表/ [由括号包围的查询]。一旦您知道可以像这样连接5或7个表,就完全没有问题。除了INNER JOIN之外,它们都是必需的。