2017-09-28 2 views
0

Ich habe diese AbfrageFalsche Abfrage bei dem Versuch, Unterabfrage zu implementieren

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 

Ich erhalte eine Fehlermeldung:

Invalid object name 'T'.

in Unterabfrage, kurz nach links Mergeverknüpfung (bei den letzten der Abfrage)

Ich weiß nicht, warum es auftritt, wenn ich 'T' als Ergebnis der Abfrage vor Join verwenden? Grüße

+0

Vielleicht möchten Sie die SQL zu brechen. Dies wird in Zukunft ein Alptraum für die Instandhaltung sein. – dhiman

+0

Glauben Sie mir, es ist ein Albtraum jetzt @DhimanBhattacharya – Ledwing

+0

Randnotiz: Vor allem auf SQL Server, bitte [nicht verwenden Sie BETWEEN'] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/ was-haben-zwischen-und-der-Teufel-haben-in-common.aspx). Ich bin nicht ganz davon überzeugt, dass "transdate" ein Datum ist, im Gegensatz zu einem vollen Zeitstempel –

Antwort

0

Wie immer ist eine sorgfältige Formatierung nützlich, um Fehler in SQL Syntax zu offenbaren.

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. 

Die Schließung ) vor der ersten WHERE Klausel ist wahrscheinlich nicht das, was Sie wollen.

SQL ist eine deklarative Sprache. Es ist viel einfacher zu verwenden, wenn Sie die Deklarationen so klar wie möglich für den Leser machen . Durch eine Neuformatierung Ihrer Anfrage, zum Beispiel, können wir leicht sehen die WHERE Klausel reduziert werden kann, um

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

weil jeder TT.TAXORIGIN 11 gleich wird, oder nicht.

Verwandte Themen