错误 3296:具有多个 JOIN 的 MS Access 查询中不支持连接表达式

Posted

技术标签:

【中文标题】错误 3296:具有多个 JOIN 的 MS Access 查询中不支持连接表达式【英文标题】:Error 3296: Join expression not supported in MS Access Query with multiple JOIN 【发布时间】:2012-03-02 16:16:15 【问题描述】:

我正在使用 Access 2003 并进行生成表查询。

我的想法是,我有多个表格,其中包含基金列表中的各种信息,我正在尝试将它们组合起来。所有表格都有 FundID 作为字段之一,这是我们用来识别每个单独基金的字段。字段 MER 有一个表,该表会不时更新。因此,我们必须在其适用期间应用 MER 值。这是我的 SQL 代码:

SELECT 
[Fund Mapping].FundID,
[Fund Mapping].FundName,
[MarketValues].DateLookup,
[MarketValues].[SumOfCurrentAmt]/100 AS [MV By Fund],
[Fund Prices @ Month End].Price,

IIf([MarketValues].DateLookup<"200908",[MER (08 to Jul 09)].MER,
  IIf([MarketValues].DateLookup<"200911",[MER (Aug 09 to Oct 09)].MER,
    IIf([MarketValues].DateLookup<"201008",[MER (Nov 09 to Jul 10)].MER,
      IIf([MarketValues].DateLookup<"201106",[MER (Aug 10 to May 11)].MER,[MER (Jun 11 to present)].MER)
    )
  )
) AS MER

INTO [Fund Data]
FROM [Fund Mapping], 

[MER (08 to Jul 09)] RIGHT JOIN 
  ([MER (Aug 09 to Oct 09)] RIGHT JOIN 
    ([MER (Nov 09 to Jul 10)] RIGHT JOIN 
      ([MER (Aug 10 to May 11)] RIGHT JOIN
        ([MER (Jun 11 to present)] RIGHT JOIN 
          ([MarketValues] INNER JOIN [Fund Prices @ Month End] 
            ON ([MarketValues].DateLookup = [Fund Prices @ Month End].DateLookup)
            AND ([MarketValues].FundID = [Fund Prices @ Month End].[Fund ID])) 
        ON [MER (Jun 11 to present)].FundID = [MarketValues].FundID)
      ON [MER (Aug 10 to May 11)].FundID = [MarketValues].FundID) 
    ON [MER (Nov 09 to Jul 10)].FundID = [MarketValues].FundID) 
  ON [MER (Aug 09 to Oct 09)].FundID = [MarketValues].FundID) 
ON [MER (08 to Jul 09)].FundID = [MarketValues].FundID

GROUP BY 
[Fund Mapping].FundID, 
[Fund Mapping].FundName, 
[MarketValues ].DateLookup, 
[SumOfCurrentAmt]/100, 
[Fund Prices @ Month End].Price, 

IIf([MarketValues].DateLookup<"200908",[MER (08 to Jul 09)].MER,
  IIf([MarketValues].DateLookup<"200911",[MER (Aug 09 to Oct 09)].MER,
    IIf([MarketValues].DateLookup<"201008",[MER (Nov 09 to Jul 10)].MER,
      IIf([MarketValues].DateLookup<"201106",[MER (Aug 10 to May 11)].MER,[MER (Jun 11 to present)].MER)
    )
  )
)

ORDER BY 
[Fund Mapping].FundID, 
[MarketValues].DateLookup;

DateLookup 是格式为 YYYYMM 的字符串。我之所以使用 RIGHT JOIN 而不是 INNER JOIN 是因为可以添加新的资金,所以早期的 MER 表不会有所有的 FundID。 “MarketValues INNER JOIN Fund prices @ Month End”表应该是整个事情的基础 - 它拥有所有资金,不应从中删除任何内容。

当我尝试保存查询时,它给了我一条错误消息,说不支持 JOIN 表达式。我不知道出了什么问题或如何解决它。

请帮忙?提前致谢!

========== 更新 #1

我在设计视图中从头开始手动添加了每个连接属性和整个查询。它给了我与上面几乎相同的代码,但允许我保存(上面的代码在我尝试保存时给我一个错误)。

但是当我尝试运行查询时,它给了我一条错误消息:“无法执行 SQL 语句,因为它包含不明确的外部连接。要强制首先执行其中一个连接,请创建一个单独的执行第一个连接然后将该查询包含在您的 SQL 语句中的查询。”

就没有其他办法了吗?

========== 更新 #2

所以我进一步挖掘,能够解决问题并让查询正常运行。

原来我所要做的就是将 [Fund Mapping] 表与所有其他表一起加入!即,我选择的所有表都连接在一起。

只是想我应该更新一下,以防其他人遇到同样的问题。

感谢您的帮助!

【问题讨论】:

这是一个看起来很吓人的 SQL,在这种情况下我会很想写一个 VBA 过程来代替。 感谢您的建议,Matt,但我能够在不经历 VBA 麻烦的情况下解决它!耶! :) 【参考方案1】:

我认为问题在于将“旧样式”交叉连接与中缀连接样式混合,例如考虑这个产生相同错误的简化示例:

SELECT *
 FROM T1, T2 RIGHT JOIN T3 ON T2.c = T3.c;

对上述问题的一个简单修复是在另一个范围内执行RIGHT JOIN,例如在派生中:

SELECT * 
  FROM T1, (
            SELECT T2.*, T3.c2
              FROM T2 RIGHT JOIN T3 ON T2.c = T3.c
           ) AS DT1;

【讨论】:

我最终发现了一个简单的问题解决方案(请参阅原始帖子中的更新 #2),但非常感谢您提供的替代方法! :)【参考方案2】:

有关此问题的解决方案,请参阅更新 #2。

【讨论】:

以上是关于错误 3296:具有多个 JOIN 的 MS Access 查询中不支持连接表达式的主要内容,如果未能解决你的问题,请参考以下文章

MS Acess不支持多个left join(语法错误(操作符丢失)在查询表达式 xx中)

如何将多个函数与ArrayFormula结合使用

MS Access - SQL LEFT JOIN 多个条件

MS Access Inner Join 3 个具有相同 field_name 的表

在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法

添加新的 Join 语句后 MS-SQL 存储过程引发错误。消息 102,级别 15,状态 1,第 279 行“WHERE”附近的语法不正确