错误 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中)
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”附近的语法不正确