2017-09-28 14 views
0

내가 가진이 쿼리 나 오류 얻을잘못된 쿼리

SELECT * 
FROM 
    (SELECT 
     TT.RECID, TT.TRANSDATE, 
     TT.DATAAREAID, TT.SOURCERECID, 
     TT.SOURCECURRENCYCODE, TT.TAXAMOUNT, 
     TT.TAXBASEAMOUNT, TT.TAXBASEAMOUNTCUR, 
     TT.TAXAMOUNTCUR, TT.TAXORIGIN, 
     TT.VOUCHER, TT.TAXITEMGROUP, 
     TT.TAXCODE, TT.SOURCEBASEAMOUNTCUR, 
     TT.SOURCETAXAMOUNTCUR, 
     TTGJAERIVA.TAXTRANSRELATIONSHIP, 
     TTGJAERIVA.GENERALJOURNALACCOUNTENTRY, 
     TTGJAERIVA.LEDGERDIMENSION, 
     GJAERIVA.TEXT, 
     GJAERIVA.LEDGERDIMENSION AS LEDGERDIMENSIONGAE, 
     GJAERIVA.POSTINGTYPE 
    FROM 
     TAXTRANS TT 
    INNER MERGE JOIN 
     TAXTRANSGENERALJOURNALACCOUNTENTRY TTGJAERIVA ON TTGJAERIVA.TAXTRANS = TT.RECID 
    INNER MERGE JOIN 
     GENERALJOURNALACCOUNTENTRY GJAERIVA ON TTGJAERIVA.GENERALJOURNALACCOUNTENTRY = GJAERIVA.RECID 
              AND GJAERIVA.POSTINGTYPE IN (14, 236, 71, 41) 
    WHERE 
     (TT.TAXORIGIN <> 11 
      AND TT.TRANSDATE BETWEEN '2015-01-01' AND '2015-04-30') 
     OR 
     (TT.TAXORIGIN = 11 
      AND TT.TRANSDATE BETWEEN '2015-01-01' AND '2015-04-30')) AS T 

---- --JOIN 
LEFT MERGE JOIN 
    (SELECT 
     SOURCERECID, TAXITEMGROUP, TAXCODE, 
     GENERALJOURNALACCOUNTENTRY, VOUCHER, TAXAMOUNT, 
     TAXAMOUNTCUR 
    FROM 
     T) TTRIVA ON T.VOUCHER = TTRIVA.VOUCHER 
        AND T.SOURCERECID = TTRIVA.SOURCERECID 
        AND TT.TAXITEMGROUP = TTRIVA.TAXITEMGROUP 
        AND (TTRIVA.TAXCODE LIKE 'RIVA%') 
        AND TTRIVA.GENERALJOURNALACCOUNTENTRY = TTGJAE.GENERALJOURNALACCOUNTENTRY 

: 하위 쿼리에

Invalid object name 'T'.

, 직후 왼쪽 병합 (쿼리의 마지막에) 가입을

---- --JOIN 
LEFT MERGE JOIN 
    (SELECT 
     SOURCERECID, TAXITEMGROUP, TAXCODE, 
     GENERALJOURNALACCOUNTENTRY, VOUCHER, 
     TAXAMOUNT, TAXAMOUNTCUR 
    FROM 
     T) TTRIVA ON T.VOUCHER = TTRIVA.VOUCHER 
        AND T.SOURCERECID = TTRIVA.SOURCERECID 
        AND TT.TAXITEMGROUP = TTRIVA.TAXITEMGROUP 
        AND (TTRIVA.TAXCODE LIKE 'RIVA%') 
        AND TTRIVA.GENERALJOURNALACCOUNTENTRY = TTGJAE.GENERALJOURNALACCOUNTENTRY 

가입 전에 쿼리 결과로 'T'를 사용하면 왜 발생하는지 알 수 없습니까? 감사합니다

+0

SQL을 분할 할 수 있습니다. 이것은 앞으로 유지 보수의 악몽이 될 것입니다. – dhiman

+0

나를 믿어 라, 그 악몽은 이제 @DhimanBhattacharya – Ledwing

+0

사이드 노트 : 특히 SQL 서버에 대해서는 [BETWEEN'을 사용하지 마십시오.] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/) 공통점은 무엇입니까?). 나는 'transdate'가 완전한 타임 스탬프가 아닌 날짜라는 것을 완전히 확신하지는 않습니다. –

답변

0

항상 그렇듯이 신중한 형식은 SQL 구문의 오류를 나타내는 데 유용합니다.

SELECT * FROM (
     SELECT 
    TT.RECID, 
    -- etc 
    GJAERIVA.POSTINGTYPE 
    FROM TAXTRANS TT 
    INNER MERGE JOIN TAXTRANSGENERALJOURNALACCOUNTENTRY TTGJAERIVA 
      ON TTGJAERIVA.TAXTRANS = TT.RECID 
    INNER MERGE JOIN GENERALJOURNALACCOUNTENTRY GJAERIVA 
      ON TTGJAERIVA.GENERALJOURNALACCOUNTENTRY = GJAERIVA.RECID 
      AND GJAERIVA.POSTINGTYPE IN(14,236,71,41 
) -- as ???? 
WHERE 
    (TT.TAXORIGIN <> 11 AND 
    TT.TRANSDATE BETWEEN '2015-01-01' AND '2015-04-30') 
OR (TT.TAXORIGIN = 11 AND 
    TT.TRANSDATE BETWEEN '2015-01-01' AND '2015-04-30') 

) AS T 
---- --JOIN 
    LEFT MERGE JOIN --- etc. 

WHERE 절 전에 폐쇄 ) 당신이 원하는 아마 아니다.

SQL은 선언적 언어입니다. 을 선언문을 가능한 한 명확하게 독자에게 나타내면 사용하기가 훨씬 쉽습니다. 검색어를 포맷하면, 예를 들어, 우리는 쉽게 모든 TT.TAXORIGIN 11, 또는하지를 동일 것이기 때문에 WHERE 절은

WHERE TT.TRANSDATE BETWEEN '2015-01-01' AND '2015-04-30' 

로 줄일 ​​수있다 볼 수 있습니다.