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

时间:2012-03-02 16:16:16

标签: sql ms-access join

我正在使用Access 2003并进行make table查询。

我的想法是,我有多个表格,其中包含基金列表中的各种信息,我正在尝试将它们组合在一起。所有表格都将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基金价格@月末”表应该是整个事情的基础 - 它拥有所有资金,并且不应该从中删除任何资金。

当我尝试保存查询时,它给出了一条错误消息,指出不支持JOIN表达式。我不知道什么是错的,或者我怎么解决它。

请帮忙吗?提前谢谢!

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

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

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

除此之外别无他法吗?

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

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

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

我以为我应该提供更新以防其他人遇到同样的问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:0)

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