2014-12-28 2 views
1
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에서도 작동해야합니까?MS-Access 내비게이션으로 LEFT JOIN 사용

+0

http://office.microsoft.com/en-us/access-help/HV080760616.aspx 또는 http://stackoverflow.com/questions/16608313/join-expression-not-supported-in-access –

답변

2

외부 조인에서 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 호환 데이터베이스로 업그레이드 할 수 있습니다.

+0

첫 번째 해결책이 좋아 보인다. JOIN EXPRESSION NOT SUPPORTED 오류를 해결했지만 U. [Current Month] 값을 묻는 액세스가 나에게 요청되었습니다. 왜 내게 내가 전에했던 내적 결합에서 가져온 가치에 대해 묻지 않았는가? 지금은 전월의 각 곱셈에 대해 별도의 쿼리를 작성하여이 문제를 해결했습니다. –

+0

@KrunalParekh. . . 나는 대답의 그 부분을 엉망으로 만들었다. 나는 [Current Month]가 다른 테이블에서 온다는 것을 알지 못했다. 그것은 문제를 조금 복잡하게 만듭니다. 나는 원래 질의가'and' (그리고 또 다른 MS Access weirdism)보다는'and on'으로 작동하는지 궁금합니다. –

+0

해결책을 찾기까지 몇 시간이 걸렸습니다. (저주받은 MS A!) –