Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用左连接和内连接的MS-ACCESS_Sql_Ms Access_Join_Left Join_Ms Access 2013 - Fatal编程技术网

Sql 使用左连接和内连接的MS-ACCESS

Sql 使用左连接和内连接的MS-ACCESS,sql,ms-access,join,left-join,ms-access-2013,Sql,Ms Access,Join,Left Join,Ms Access 2013,上面是我想要执行的MS-ACCESS查询。对于安全id 14,我想做的很简单,我想在[Previor month returns Tbl]中计算当前月份[Data 9至17 Monthly]表中前7至11个月的报表的乘法。如果我使用内部联接,查询可以正常工作,但是如果[Data 9 to 17 Monthly]中不存在所有前11个月的记录,则查询将忽略结果,因此我使用左联接,但得到的错误是联接表达式不受支持。请帮忙。我知道这个查询在t-sql中可以很好地工作。我该怎么做才能使此查询在MS Acc

上面是我想要执行的MS-ACCESS查询。对于安全id 14,我想做的很简单,我想在[Previor month returns Tbl]中计算当前月份[Data 9至17 Monthly]表中前7至11个月的报表的乘法。如果我使用内部联接,查询可以正常工作,但是如果[Data 9 to 17 Monthly]中不存在所有前11个月的记录,则查询将忽略结果,因此我使用左联接,但得到的错误是联接表达式不受支持。请帮忙。我知道这个查询在t-sql中可以很好地工作。我该怎么做才能使此查询在MS Access中也能工作?

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

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

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
或者,您可以使用条件聚合将所有数据合并到一行中:

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]
然后根据需要调整外部
选择


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

或者第一个解决方案看起来不错。它为我解决了连接表达式不受支持的错误,但access向我询问U[当前月份]的值。为什么它要求我从我以前做的内部连接中获取它的值,对吗?现在我已经解决了这个问题,为每个前一个月创建了单独的查询。@KrunalParekh。我把答案的那部分搞错了。我没有注意到
[当前月份]
来自不同的表。这让事情有点复杂。我想知道您最初的查询是否适用于
而不是
(另一个MS Access怪癖)。我花了几个小时才找到解决方案。(该死的A女士!)
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]