0

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

我在这里想念什么?

4

3 回答 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,所以它避免了任何混淆。

于 2012-08-16T12:41:46.443 回答
0

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

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

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

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

于 2012-08-16T14:46:07.953 回答
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

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

于 2012-08-16T14:49:32.413 回答