2012-07-27 2 views
2

이 T-SQL 쿼리를 MS ACCESS로 변환하는 데 도움이 필요합니다. 내가 얻는 오류 JOIN식이 지원되지 않습니다.T-SQL 왼쪽 조인 하위 쿼리를 MS 액세스로 변환

업데이트 :

내가 추가 할 수 없습니다.

DDA ON TT [설명] = DDA.AccountTypeDesc 및 H.AccountNumber = DDA.AccountNumber

그러나

DDA를 ON TT. [설명] = DDA.AccountTypeDesc

작품입니다. 두 번째 조건을 추가하는 방법이 있습니까?

T-SQL 쿼리 :

SELECT 
    * 
FROM 
(
    SELECT 
     [PesoAmount] = CASE WHEN FE.IsoCode IS NULL THEN 
      LTRIM(STR(DFCF.CurrencyAmount, 20, 2)) 
     ELSE 
      LTRIM(STR(DFCF.CurrencyAmount * FE.PhpConversionRate, 20, 2)) 
     END, 
     DFCF.TransactionNumber, 
     DFCF.AccountNumber, 
     DFCF.CountryCd, 
     DFCF.TransactionTypeCd, 
     DFCF.Time, 
     DFCF.Date, 
     DFCF.TransactionStatusCd, 
     DFCF.TransactionCurrencyCd, 
     DFCF.BranchNumber, 
     DFCF.RemitterExtPartyCd, 
     DFCF.BeneficiaryExtPartyCd, 
     DFCF.PostedDate, 
     DFCF.AssociateNumber, 
     DFCF.ExecutingPartyNumber, 
     DFCF.CurrencyAmount, 
     DFCF.CurrencyAmountInTxnCcy, 
     DFCF.CurrencyAmountInAccountCcy, 
     DFCF.SecondaryAccountKey, 
     DFCF.RelatedInd, 
     DFCF.ThirdPartyInd, 
     DFCF.TransactionDescription, 
     DFCF.SecurityName, 
     DFCF.DealNumber 
    FROM 
     dbo.DesFactCashFlow DFCF (NOLOCK)           LEFT JOIN 
     dbo.ForeignExchange FE (NOLOCK) ON DFCF.TransactionCurrencyCd = FE.IsoCode 
) 
          H                       LEFT JOIN 
    dbo.Ctr    C (NOLOCK) ON H.PesoAmount       = C.PesoAmountFaceValueSumInsured AND 
             H.AccountNumber      = C.AccountNumber     AND 
             H.TransactionTypeCd     = C.TransactionType     LEFT JOIN 
    dbo.TransactionType TT (NOLOCK) ON H.TransactionTypeCd     = TT.Code        LEFT JOIN 
(
    SELECT 
     [AccountNumber]    = DDA2.AccountNumber, 
     [AccountTypeDesc]    = DDA2.AccountTypeDesc, 
     [LineOfBusinessName]   = MAX(DDA2.LineOfBusinessName), 
     [AccountCurrencyCode]   = MAX(DDA2.AccountCurrencyCode), 
     [AccountCurrencyName]   = MAX(DDA2.AccountCurrencyName), 
     [AccountRegistrationTypeDesc] = MAX(DDA2.AccountRegistrationTypeDesc), 
     [AccountRegistrationName]  = MAX(DDA2.AccountRegistrationName), 
     [AccountName]     = MAX(DDA2.AccountName), 
     [AlternateName]    = MAX(DDA2.AlternateName), 
     [AccountOpenDate]    = MAX(DDA2.AccountOpenDate), 
     [AccountCloseDate]   = MAX(DDA2.AccountCloseDate), 
     [AccountStatusDesc]   = MAX(DDA2.AccountStatusDesc), 
     [DormantInd]     = MAX(DDA2.DormantInd), 
     [ProductLineName]    = MAX(DDA2.ProductLineName), 
     [ProductCategoryName]   = MAX(DDA2.ProductCategoryName), 
     [ProductTypeName]    = MAX(DDA2.ProductTypeName), 
     [ProductName]     = MAX(DDA2.ProductName), 
     [ProductNumber]    = MAX(DDA2.ProductNumber), 
     [AccountTaxId]    = MAX(DDA2.AccountTaxId), 
     [AccountTaxIdTypeCode]  = MAX(DDA2.AccountTaxIdTypeCode), 
     [AccountTaxStateCode]   = MAX(DDA2.AccountTaxStateCode), 
     [AccountPrimaryBranchName] = MAX(DDA2.AccountPrimaryBranchName), 
     [MailingAddress1]    = MAX(DDA2.MailingAddress1), 
     [MailingAddress2]    = MAX(DDA2.MailingAddress2), 
     [MailingCityName]    = MAX(DDA2.MailingCityName), 
     [MailingStateCode]   = MAX(DDA2.MailingStateCode), 
     [MailingStateName]   = MAX(DDA2.MailingStateName), 
     [MailingPostalCode]   = MAX(DDA2.MailingPostalCode), 
     [MailingCountryCode]   = MAX(DDA2.MailingCountryCode), 
     [MailingCountryName]   = MAX(DDA2.MailingCountryName), 
     [CurrencyBasedAccountInd]  = MAX(DDA2.CurrencyBasedAccountInd), 
     [MaturityDate]    = MAX(DDA2.MaturityDate), 
     [OriginalLoanAmount]   = MAX(DDA2.OriginalLoanAmount), 
     [CollateralTypeDesc]   = MAX(DDA2.CollateralTypeDesc), 
     [CollateralTypeCode]   = MAX(DDA2.CollateralTypeCode), 
     [InsuredAmount]    = MAX(DDA2.InsuredAmount), 
     [EmployeeInd]     = MAX(DDA2.EmployeeInd) 
    FROM 
     dbo.DesDimAccount DDA2 (NOLOCK) 
    GROUP BY 
     DDA2.AccountNumber, 
     DDA2.AccountTypeDesc 
) 
         DDA   ON RTRIM(TT.[Description])    = RTRIM(DDA.AccountTypeDesc)  AND 
             H.AccountNumber      = DDA.AccountNumber 

편집 : 나는 AS 키워드를 사용하여 쿼리를 대체했다. 같은 오류가 발생합니다. 오류와 MS 액세스 쿼리 :

여기
SELECT 
    'H'       AS [HeaderRecordIndicator], 
    '1'       AS [SupervisingAgency], 
    '0' + I.InstitutionCode  AS [InstitutionCode], 
    CONVERT(char(8), H.Date, 112) AS [ReportDate], 
    'CTR'       AS [ReportType], 
    '21'       AS [FormatCode], 
    '1'       AS [SubmissionType] 
FROM 
(((
    SELECT 
     IIF(ISNULL(FE.IsoCode), FORMAT(DFCF.CurrencyAmount, "##################.00"), FORMAT(DFCF.CurrencyAmount * FE.PhpConversionRate, "##################.00")) AS [PesoAmount], 
     DFCF.TransactionNumber, 
     DFCF.AccountNumber, 
     DFCF.CountryCd, 
     DFCF.TransactionTypeCd, 
     DFCF.Time, 
     DFCF.Date, 
     DFCF.TransactionStatusCd, 
     DFCF.TransactionCurrencyCd, 
     DFCF.BranchNumber, 
     DFCF.RemitterExtPartyCd, 
     DFCF.BeneficiaryExtPartyCd, 
     DFCF.PostedDate, 
     DFCF.AssociateNumber, 
     DFCF.ExecutingPartyNumber, 
     DFCF.CurrencyAmount, 
     DFCF.CurrencyAmountInTxnCcy, 
     DFCF.CurrencyAmountInAccountCcy, 
     DFCF.SecondaryAccountKey, 
     DFCF.RelatedInd, 
     DFCF.ThirdPartyInd, 
     DFCF.TransactionDescription, 
     DFCF.SecurityName, 
     DFCF.DealNumber 
    FROM 
     DesFactCashFlow DFCF           LEFT JOIN 
     ForeignExchange FE ON DFCF.TransactionCurrencyCd = FE.IsoCode 
) AS 
         H                     LEFT JOIN 
    Ctr    C ON H.PesoAmount       = C.PesoAmountFaceValueSumInsured AND 
          H.AccountNumber      = C.AccountNumber     AND 
          H.TransactionTypeCd     = C.TransactionType)     LEFT JOIN 
    TransactionType TT ON H.TransactionTypeCd     = TT.Code)        LEFT JOIN 
(
    SELECT 
     DDA2.AccountNumber     AS [AccountNumber], 
     DDA2.AccountTypeDesc     AS [AccountTypeDesc], 
     MAX(DDA2.LineOfBusinessName)   AS [LineOfBusinessName], 
     MAX(DDA2.AccountCurrencyCode)   AS [AccountCurrencyCode], 
     MAX(DDA2.AccountCurrencyName)   AS [AccountCurrencyName], 
     MAX(DDA2.AccountRegistrationTypeDesc) AS [AccountRegistrationTypeDesc], 
     MAX(DDA2.AccountRegistrationName)  AS [AccountRegistrationName], 
     MAX(DDA2.AccountName)     AS [AccountName], 
     MAX(DDA2.AlternateName)    AS [AlternateName], 
     MAX(DDA2.AccountOpenDate)    AS [AccountOpenDate], 
     MAX(DDA2.AccountCloseDate)   AS [AccountCloseDate], 
     MAX(DDA2.AccountStatusDesc)   AS [AccountStatusDesc], 
     MAX(DDA2.DormantInd)     AS [DormantInd], 
     MAX(DDA2.ProductLineName)    AS [ProductLineName], 
     MAX(DDA2.ProductCategoryName)   AS [ProductCategoryName], 
     MAX(DDA2.ProductTypeName)    AS [ProductTypeName], 
     MAX(DDA2.ProductName)     AS [ProductName], 
     MAX(DDA2.ProductNumber)    AS [ProductNumber], 
     MAX(DDA2.AccountTaxId)    AS [AccountTaxId], 
     MAX(DDA2.AccountTaxIdTypeCode)  AS [AccountTaxIdTypeCode], 
     MAX(DDA2.AccountTaxStateCode)   AS [AccountTaxStateCode], 
     MAX(DDA2.AccountPrimaryBranchName) AS [AccountPrimaryBranchName], 
     MAX(DDA2.MailingAddress1)    AS [MailingAddress1], 
     MAX(DDA2.MailingAddress2)    AS [MailingAddress2], 
     MAX(DDA2.MailingCityName)    AS [MailingCityName], 
     MAX(DDA2.MailingStateCode)   AS [MailingStateCode], 
     MAX(DDA2.MailingStateName)   AS [MailingStateName], 
     MAX(DDA2.MailingPostalCode)   AS [MailingPostalCode], 
     MAX(DDA2.MailingCountryCode)   AS [MailingCountryCode], 
     MAX(DDA2.MailingCountryName)   AS [MailingCountryName], 
     MAX(DDA2.CurrencyBasedAccountInd)  AS [CurrencyBasedAccountInd], 
     MAX(DDA2.MaturityDate)    AS [MaturityDate], 
     MAX(DDA2.OriginalLoanAmount)   AS [OriginalLoanAmount], 
     MAX(DDA2.CollateralTypeDesc)   AS [CollateralTypeDesc], 
     MAX(DDA2.CollateralTypeCode)   AS [CollateralTypeCode], 
     MAX(DDA2.InsuredAmount)    AS [InsuredAmount], 
     MAX(DDA2.EmployeeInd)     AS [EmployeeInd] 
    FROM 
     DesDimAccount DDA2 
    GROUP BY 
     DDA2.AccountNumber, 
     DDA2.AccountTypeDesc 
) AS 
         DDA   ON RTRIM(TT.[Description])    = RTRIM(DDA.AccountTypeDesc)  AND 
             H.AccountNumber      = DDA.AccountNumber     

같은 오류와 단순화 된 쿼리입니다 :

SELECT 
    * 
FROM 
(((
    SELECT 
     IIF(ISNULL(FE.IsoCode), FORMAT(DFCF.CurrencyAmount, "##################.00"), FORMAT(DFCF.CurrencyAmount * FE.PhpConversionRate, "##################.00")) AS [PesoAmount], 
     DFCF.TransactionNumber, 
     DFCF.TransactionCurrencyCd, 
    FROM 
     DesFactCashFlow DFCF           LEFT JOIN 
     ForeignExchange FE ON DFCF.TransactionCurrencyCd = FE.IsoCode 
) AS 
         H                     LEFT JOIN 
    Ctr    C ON H.PesoAmount       = C.PesoAmountFaceValueSumInsured AND 
          H.AccountNumber      = C.AccountNumber     AND 
          H.TransactionTypeCd     = C.TransactionType)     LEFT JOIN 
    TransactionType TT ON H.TransactionTypeCd     = TT.Code)        LEFT JOIN 
(
    SELECT 
     DDA2.AccountNumber     AS [AccountNumber], 
     DDA2.AccountTypeDesc     AS [AccountTypeDesc], 
     MAX(DDA2.LineOfBusinessName)   AS [LineOfBusinessName], 
    FROM 
     DesDimAccount DDA2 
    GROUP BY 
     DDA2.AccountNumber, 
     DDA2.AccountTypeDesc 
) AS 
         DDA   ON RTRIM(TT.[Description])    = RTRIM(DDA.AccountTypeDesc)  AND 
             H.AccountNumber      = DDA.AccountNumber     
+0

별칭 앞에 'AS'라고 써야한다는 것을 기억해야합니다. –

+0

업데이트되었지만 AS 키워드를 사용하더라도 동일한 오류를 반환합니다. – yoitsfrancis

+0

테이블 별칭에도 'AS'를 사용하십시오. 나는 'JOIN'의 –

답변

2

시도해주십시오. T-SQL 쿼리의 SQL 텍스트를 Access SQL로 변환하십시오. 처음부터 새로운 Access 쿼리를 만들고 로드맵으로 만 T-SQL 쿼리를 사용하십시오. 데이터 소스를 추가하고 조인을 설정하십시오. 쿼리 디자이너는 db 엔진을 행복하게 유지하는 방식으로 조인을 만들 것을 보장합니다. 둘 이상의 조인이있는 쿼리에 필요한 괄호 추가 및 위치 지정. LEFT JOINs에 적용되는 규칙; 기타 등등. 디자이너가 세부 정보를 처리하도록하십시오.

디자이너가 디자인보기에 질식 것 때문에 마지막의이 부분의 기능을 결합 : 당신은이 디자인보기에서 조인 설정하는 동안

RTRIM(TT.[Description]) = RTRIM(DDA.AccountTypeDesc) 

는 그래서 RTRIM() 기능을 둡니다. 쿼리가 올바른 결과를 반환하지 않는다고 걱정하지 마십시오. db 엔진을 만족하는 조인을 얻은 후 SQL보기로 전환하고 RTRIM() 함수를 다시 추가하십시오.

조인을 올바르게 설정 한 후에 필드 표현식을 SELECT 목록에 추가하십시오.

하위 쿼리를 별도의 저장된 쿼리로 분리하여 복잡한 쿼리를 관리하는 것이 더 쉬울 수도 있습니다. 그런 다음 테이블 원본처럼 마스터 쿼리에서 해당 쿼리를 이름으로 참조하십시오.

+0

업데이트 : 내가 추가 할 수 없습니다 :.. DDA ON TT [설명] = DDA.AccountTypeDesc 및 H.AccountNumber = DDA.AccountNumber 그러나 DDA ON TT [설명] = DDA.AccountTypeDesc 작품. 두 번째 조건을 추가하는 방법이 있습니까? – yoitsfrancis

+0

'ON' 절의 AccountNumber와 결합 할 수있는 방법을 찾지 못하면 마지막 WHERE 절로 이동하십시오 :'WHERE H.AccountNumber = DDA.AccountNumber' 당신은'OR DDA.AccountNumber는 Null입니다. ' – HansUp

+0

HansUp! 정답으로 표시! – yoitsfrancis

1

문제는 끝에서 두 번째 라인이다 :의

DDA ON RTRIM(TT.[Description]) = RTRIM(DDA.AccountTypeDesc) AND 

디자인보기 Access 쿼리 디자이너는 절의 ON 부분에있는 함수로는 작업 할 수 없습니다. RTRIM을 삭제해야합니다.

+0

@HansUp : 당신은 절대적으로 맞습니다. 수정 됨. 나는 이것을 허용되지 않는 상수 (예 :'... ON TT.Description = '123'')와 혼합했다. – MicSim

+0

업데이트 : 내가 추가 할 수 없습니다 :.. DDA ON TT [설명] = DDA.AccountTypeDesc 및 H.AccountNumber = DDA.AccountNumber 그러나 DDA ON TT [설명] = DDA.AccountTypeDesc 작품. 두 번째 조건을 추가하는 방법이 있습니까? – yoitsfrancis

0

시스템에서 사용중인 MSAccess 버전은 무엇입니까? 방금 2007 버전에서 시도하고 RTRIM 작동합니다.

+0

우리는 2007 년 같은 버전을 사용하고 있습니다! – yoitsfrancis

0

액세스가 괄호 안에 표시됩니다.각 조인 식을 괄호로 묶고 ON 절 자체 및 각 테이블 쌍을 래핑합니다.

CONVERT, NOLOCK 또는 CASE는 사용할 수 없습니다.

+0

이미 그랬습니다. – yoitsfrancis