我有一些 SQL 连接 Access 中的多个表。当尝试运行它时,我在“JOIN”中收到错误(特别是“不支持 JOIN 表达式”)。我相信我已经将问题范围缩小到一个连接,但为什么它不起作用对我来说没有任何意义。原始完整的 SQL FROM 子句是这样的:
FROM (
(
Customers RIGHT JOIN
(
Sales LEFT JOIN SaleType ON Sales.SalesForID = SaleType.SalesForID
)
ON Customers.CustomerID = Sales.CustomerID
) LEFT JOIN
(
StudentContracts LEFT JOIN
(
StudentsClasses INNER JOIN Classes ON StudentsClasses.ClassID = Classes.ClassID
)
ON StudentContracts.CustomerID = StudentsClasses.CustomerID
)
ON Customers.CustomerID = StudentContracts.CustomerID
)
我认为查询失败的部分是在这个“LEFT”连接上:
(
StudentContracts LEFT JOIN
(
StudentsClasses INNER JOIN Classes ON StudentsClasses.ClassID = Classes.ClassID
)
ON StudentContracts.CustomerID = StudentsClasses.CustomerID
)
我尝试将“LEFT”切换为“INNER”并且它有效。我已将其切换为“RIGHT”并且有效。为什么它不适用于“LEFT”连接但适用于其他连接?我需要的是一个结果,显示连接到 StudentContracts 的连接“Classes”表中的记录,但也显示在 Classes 表中没有记录的 StudentContracts。根据这篇文章的答案:SQL Server 中左连接和右连接之间的区别我相当确定我想要左连接,这应该可以工作。
我在这里缺少什么?
括号太多,而且顺序不正确。最简单的方法是在 MS Access 的查询设计窗口中构建它,然后一切都会为您生成,您可以切换到 SQL 视图来查看。
例如,上面的内容应该是这样的:
SELECT *
FROM (Customers
RIGHT JOIN Sales
ON Customers.CustomerID = Sales.CustomerID)
LEFT JOIN SaleType
ON Sales.SalesForID = SaleType.SalesForID
惯例是避免 RIGHT JOIN,因为它们可以很容易地写成 LEFT JOIN,因此可以避免任何混淆。
我想我应该回答我自己的问题,因为这两个建议并不是真正的答案,而是有关故障排除的建议(有效),我现在找到了答案。
确实是之前定义的连接有问题。 StudentsClasses 在数据库关系中以多对一的方式连接到 Classes。这就是整个数据库中的大多数连接将这两个表视为链接的方式。仅在这种情况下,我希望它们的加入方式略有不同。当我的 SQL 要求内部联接时,它似乎混淆了访问程序我的意思(内部联接或外部联接)。通过将其更改为适当的外连接,程序开始正常运行。
虽然内部联接确实是我想要的,但在这种情况下,这并不重要,因为具有额外记录的一侧将被其他联接减少,因此无论如何都不会产生任何在类表中没有匹配的记录(至少据我所知)。
非常感谢Remou和Matt Donnan为我指明了正确的方向!
Access 对括号连接很挑剔。通常,它希望看到这样编写的查询:
FROM (((((Sales
LEFT JOIN Customers ON Sales.CustomerID = Customers.CustomerID)
LEFT JOIN SaleType ON Sales.SalesForID = SaleType.SalesForID)
LEFT JOIN StudentContracts ON Customers.CustomerID = StudentContracts.CustomerID)
LEFT JOIN StudentsClasses ON StudentContracts.CustomerID = StudentsClasses.CustomerID)
LEFT JOIN Classes ON StudentsClasses = Classes.ClassID)
在不知道表的确切结构的情况下,很难知道这是否会给您带来所需的输出;但我希望类似的东西会起作用。你说:
我想要一个结果,显示链接到 StudentContracts 的联接“Classes”表中的记录,但也显示在 Classes 表中没有记录的 StudentContracts
在我看来,这是一种令人费解的说法
StudentContracts LEFT JOIN Classes