我在Access中有一些SQL连接多个表。尝试运行它时,我在“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
)
我认为查询失败的部分是在这个“左”加入:
(
StudentContracts LEFT JOIN
(
StudentsClasses INNER JOIN Classes ON StudentsClasses.ClassID = Classes.ClassID
)
ON StudentContracts.CustomerID = StudentsClasses.CustomerID
)
我尝试将“LEFT”切换为“INNER”并且它有效。我已将它切换为“正确”并且有效。为什么它不能用于“左”加入而是为其他人工作?我需要的是一个结果,显示链接到StudentContracts的连接“类”表中的记录,以及没有Classes表中记录的StudentContracts。根据这篇文章的回答:Difference between left join and right join in SQL Server我很确定我想要一个左连接,这应该有效。
我在这里缺少什么?
答案 0 :(得分:3)
你的括号太多,而且事情的顺序不正确。在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,因此可以避免任何混淆。
答案 1 :(得分:0)
猜猜我应该回答我自己的问题,因为这两个建议不是真正的答案,而是关于解决问题的建议(有效),我现在找到了答案。
以前定义的连接确实存在问题。 StudentsClasses在数据库关系中以多对一的方式连接到类。这就是整个数据库中的大多数连接将这两个表视为链接的方式。只有在这种情况下,我希望它们的加入方式略有不同。当我的SQL要求内连接时,它似乎混淆了访问程序的含义(内部或外部连接)。通过将其更改为适当的外部联接,程序开始运行正常。
虽然内连接确实是我想要的,但在这种情况下它并不重要,因为具有额外记录的一方将被其他连接减少,因此在类中没有匹配时将不会产生任何记录无论如何(至少就我所见)。
所以,非常感谢Remou和Matt Donnan指出我正确的方向!
答案 2 :(得分:0)
访问是关于包围连接的挑剔。通常,它希望看到这样写的查询:
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
(如果我错了,毫无疑问会有人纠正我。)