【问题标题】:MS-ACCESS Using LEFT JOIN with INNER JOINMS-ACCESS 使用 LEFT JOIN 和 INNER JOIN
【发布时间】:2014-12-28 07:45:14
【问题描述】:
SELECT
U.[Current Month], 
U.[Security Name],
U.[CM Return],
(P1.[Return] * P2.[Return] * P3.[Return] * P4.[Return] * P5.[Return] * P6.[Return] * P7.[Return]) AS [7 Month Return],
(P1.[Return] * P2.[Return] * P3.[Return] * P4.[Return] * P5.[Return] * P6.[Return] * P7.[Return] * P8.[Return]) AS [8 Month Return],
(P1.[Return] * P2.[Return] * P3.[Return] * P4.[Return] * P5.[Return] * P6.[Return] * P7.[Return] * P8.[Return] * P9.[Return]) AS [9 Month Return],
(P1.[Return] * P2.[Return] * P3.[Return] * P4.[Return] * P5.[Return] * P6.[Return] * P7.[Return] * P8.[Return] * P9.[Return] * P10.[Return]) AS [10 Month Return],
(P1.[Return] * P2.[Return] * P3.[Return] * P4.[Return] * P5.[Return] * P6.[Return] * P7.[Return] * P8.[Return] * P9.[Return] * P10.[Return] * P11.[Return]) AS [11 Month Return]
FROM ((((((((((((
[Prior Month Returns Tbl] AS U
INNER JOIN [Securities] AS S ON U.[Security Name] = S.[Security Name])
LEFT JOIN [Data 9 17 Monthly] AS P1 ON P1.[Security ID] = S.[ID] AND P1.[Date Month] = DateAdd("m",-1,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P2 ON P2.[Security ID] = S.[ID] AND P2.[Date Month] = DateAdd("m",-2,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P3 ON P3.[Security ID] = S.[ID] AND P3.[Date Month] = DateAdd("m",-3,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P4 ON P4.[Security ID] = S.[ID] AND P4.[Date Month] = DateAdd("m",-4,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P5 ON P5.[Security ID] = S.[ID] AND P5.[Date Month] = DateAdd("m",-5,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P6 ON P6.[Security ID] = S.[ID] AND P6.[Date Month] = DateAdd("m",-6,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P7 ON P7.[Security ID] = S.[ID] AND P7.[Date Month] = DateAdd("m",-7,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P8 ON P8.[Security ID] = S.[ID] AND P8.[Date Month] = DateAdd("m",-8,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P9 ON P9.[Security ID] = S.[ID] AND P9.[Date Month] = DateAdd("m",-9,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P10 ON P10.[Security ID] = S.[ID] AND P10.[Date Month] = DateAdd("m",-10,U.[Current Month]))
LEFT JOIN [Data 9 17 Monthly] AS P11 ON P11.[Security ID] = S.[ID] AND P11.[Date Month] = DateAdd("m",-11,U.[Current Month]))
WHERE S.ID = 14

上面是我想要执行的 MS-ACCESS 查询。对于安全 ID 14,我想要做的很简单,我想计算 [上月回报 Tbl] 中当前月份的 [Data 9 to 17 Monthly] 表中前 7 到 11 个月回报的乘积。如果我使用内部联接,查询工作正常,但如果不是所有前 11 个月的记录都存在于 [Data 9 to 17 Monthly] 中,它将忽略结果,所以这就是我使用左联接但我收到 JOIN EXPRESSION 的错误不支持。请帮忙。我知道这个查询在 t-sql 中可以正常工作。我应该怎么做才能让这个查询在 MS-Access 中也能工作?

【问题讨论】:

标签: sql ms-access join left-join ms-access-2013


【解决方案1】:

在外连接中,MS Access 不支持不在两个表之间的条件。在我看来,这是一个非常奇怪的限制。

您可以使用子查询来解决它。这是一个例子:

LEFT JOIN
(SELECT P1.*
 FROM [Data 9 17 Monthly] AS P1
 WHERE P1.[Date Month] = DateAdd("m",-1,U.[Current Month]))
) as P1
ON P1.[Security ID] = S.[ID]

或者,您可以使用条件聚合将所有数据组合成一行:

LEFT JOIN
(SELECT [Security ID],
        MAX(IIF(P1.[Date Month] = DateAdd("m", -1, U.[Current Month])), [RETURN], 1) as Return_01,
        MAX(IIF(P1.[Date Month] = DateAdd("m", -2, U.[Current Month])), [RETURN], 1) as Return_02,
        . . .
        MAX(IIF(P1.[Date Month] = DateAdd("m", -12, U.[Current Month])), [RETURN], 1) as Return_12
) as P
ON P.[Security ID] = S.[ID]

然后根据需要调整外部SELECT

或者,您可以升级到更符合 ANSI 的数据库。

【讨论】:

  • 第一个解决方案看起来不错。为我工作它解决了 JOIN EXPRESSION NOT SUPPORTED 错误,但访问询问我 U.[Current Month] 的值。为什么它要我从我之前做的内部连接中获取价值?现在我已经通过为每个上个月的乘法创建单独的查询来解决这个问题。
  • @KrunalParekh 。 . .我搞砸了答案的那一部分。我没有注意到 [Current Month] 来自不同的表。这使事情变得有点复杂。我想知道您的原始查询是否适用于 and on 而不是 and(又一个 MS Access 怪癖)。
  • 我花了几个小时才找到解决方案。 (该死的 MS A!)
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 2015-08-25
  • 2012-08-17
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2014-03-11
  • 2018-07-10
相关资源
最近更新 更多