右连接有效,内连接有效,左连接无效?为什么?

问题描述 投票:0回答:3

我有一些 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 中左连接和右连接之间的区别我相当确定我想要左连接,这应该可以工作。

我在这里缺少什么?

sql ms-access join
3个回答
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,因此可以避免任何混淆。


0
投票

我想我应该回答我自己的问题,因为这两个建议并不是真正的答案,而是有关故障排除的建议(有效),我现在找到了答案。

确实是之前定义的连接有问题。 StudentsClasses 在数据库关系中以多对一的方式连接到 Classes。这就是整个数据库中的大多数连接将这两个表视为链接的方式。仅在这种情况下,我希望它们的加入方式略有不同。当我的 SQL 要求内部联接时,它似乎混淆了访问程序我的意思(内部联接或外部联接)。通过将其更改为适当的外连接,程序开始正常运行。

虽然内部联接确实是我想要的,但在这种情况下,这并不重要,因为具有额外记录的一侧将被其他联接减少,因此无论如何都不会产生任何在类表中没有匹配的记录(至少据我所知)。

非常感谢RemouMatt Donnan为我指明了正确的方向!


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.