右连接工作,内连接工作,左连接不?为什么?

时间:2012-08-16 11:57:52

标签: sql ms-access join

我在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我很确定我想要一个左连接,这应该有效。

我在这里缺少什么?

3 个答案:

答案 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要求内连接时,它似乎混淆了访问程序的含义(内部或外部连接)。通过将其更改为适当的外部联接,程序开始运行正常。

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

所以,非常感谢RemouMatt 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

的方式

(如果我错了,毫无疑问会有人纠正我。)