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 "".
我试过到目前为止:
- T1的顺序相反。[模型数] = T2。[模型号]等...
- 添加/围绕T1/T2/T3别名卸下方括号
- 完全删除WHERE语句
- 将“AS”放在表别名标注的前面(即, LEFT JOIN [table1] AS t1)
- 减少所有数据,以便每个表中只有一个字段被引用(如果我在原始尝试中调出的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子句之间是否有我缺少的语法?
答
访问显然需要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。
我想你需要一个'FROM'子句以及你要返回的字段之间的逗号。除非这只是你正在运行的一个片段... – Forty3
在原来的文章中,我意外地输入了“GROUP BY”而不是“ORDER BY” - 我在代码示例中修复了这个问题。我的错。 – andrewec
也是我的错!我在我的实际代码中有一个FROM子句和逗号 - 我将编辑帖子以反映它。 – andrewec