无法执行SQL语句,因为它包含不明确的外部联接。哪里

无法执行SQL语句,因为它包含不明确的外部联接。哪里,sql,ms-access,Sql,Ms Access,我运行此操作时收到一条错误消息。你知道为什么吗?我使用Access设计视图构建了它 SELECT [Sales structure].Cluster , [Sales structure].Country , [Transaction details].[Sales company code] , [Sales structure].[Sales company name] , YEAR([Transaction details]

我运行此操作时收到一条错误消息。你知道为什么吗?我使用Access设计视图构建了它

SELECT  [Sales structure].Cluster ,
        [Sales structure].Country ,
        [Transaction details].[Sales company code] ,
        [Sales structure].[Sales company name] ,
        YEAR([Transaction details].[YYYY-MM-DD]) AS [Year] ,
        MONTH([Transaction details].[YYYY-MM-DD]) AS [Month] ,
        SUM([Transaction details].[Sales volume LOC]) AS Total ,
        [Transaction details].[Currency code] ,
        Currencies.[CUR/EUR] AS [Currency rate]
FROM    Items ,
        Currencies
        RIGHT JOIN ( [Sales structure]
                     RIGHT JOIN [Transaction details] ON [Sales structure].[Sales company code] = [Transaction details].[Sales company code]
                   ) ON Currencies.[Currency code] = [Transaction details].[Currency code]
GROUP BY [Sales structure].Cluster ,
        [Sales structure].Country ,
        [Transaction details].[Sales company code] ,
        [Sales structure].[Sales company name] ,
        YEAR([Transaction details].[YYYY-MM-DD]) ,
        MONTH([Transaction details].[YYYY-MM-DD]) ,
        [Transaction details].[Currency code] ,
        Currencies.[CUR/EUR]
HAVING  ( ([Transaction details].[Currency code] = [Currencies].[Currency code]) )
ORDER BY YEAR([Transaction details].[YYYY-MM-DD]) ,
        MONTH([Transaction details].[YYYY-MM-DD]) ;

项目
货币
表之间没有
联接
条件。它们只是以逗号开头

MS Access对连接非常挑剔。您可能还希望在每个连接周围放上括号,因为它可能有关于缺少括号的连接,即使查询没有括号在语法上是正确的


我强烈建议您忘记可以使用逗号
并通过在
WHERE
子句中放置连接条件来连接表。这是旧的风格,应该放弃!请开始使用ANSI SQL联接,这些联接(在第一个表之后)通过
JOIN
子句引入,并通过
ON
子句联接。这有很多令人信服的原因——如果你想了解更多,只需在线搜索。

项目
货币
表之间没有
联接
条件。它们只是以逗号开头

MS Access对连接非常挑剔。您可能还希望在每个连接周围放上括号,因为它可能有关于缺少括号的连接,即使查询没有括号在语法上是正确的


我强烈建议您忘记可以使用逗号
并通过在
WHERE
子句中放置连接条件来连接表。这是旧的风格,应该放弃!请开始使用ANSI SQL联接,这些联接(在第一个表之后)通过
JOIN
子句引入,并通过
ON
子句联接。这有很多令人信服的原因——如果你想了解更多,只需在网上搜索一下。

这是令人不快的部分:
来自物品、货币
。您没有将
与其他表连接。但现在我遇到了一个不同的问题。Access在“[交易详细信息].[货币代码]=[货币].[货币代码]”上抱怨“您的查询不包括指定的表达式[交易详细信息].[货币代码]=[货币].[货币代码]作为聚合函数的一部分,请提出一个新问题这是有问题的部分:
来自项目、货币
。您没有将
项目
与其他表合并。但现在我遇到了一个不同的问题。Access抱怨“[交易详细信息].[货币代码]=[货币].[货币代码]”即”您的查询未将指定的表达式[Transaction details].[Currency code]=[Currency].[Currency code]作为聚合函数的一部分。请在任何数据库中进一步询问一个新问题。您不得将隐式联接和显式联接组合在一起,您将得到错误的结果或错误,因为显式联接是在where子句之前计算的(无法告诉您我看到了多少问题,想知道哪里出了问题)。事实上,使用隐式连接是一种SQL反模式。很好,@HLGEM!为了解决这一问题,我在回答中添加了更多内容。此外,在任何数据库中,如果您不将隐式连接和显式连接结合起来,您将得到错误的结果或错误,因为显式连接是在where子句之前计算的(无法告诉您我看到了多少问题;我想知道是什么错了)。事实上,使用隐式连接是一种SQL反模式。很好,@HLGEM!为了解决这一问题,我在回答中添加了更多内容。