2017-06-12 4 views
-2

Ich versuche, eine SQL-Abfrage zu verwenden, die die folgende Struktur aufweist:CTE falsche Syntax in der Nähe „)“

WITH 
table1 
    AS (QUERY1) 
, table2 
    AS (QUERY2) 
, myCTE (COLUMNS OF THE CTE) 
    AS (CTE_QUERY) 
    SELECT * FROM myCTE), 
,anotherCTE... 

Ich erhalte ein „falscher Syntaxfehler in der Nähe von‚)‘in der Nähe von‚myCTE)‘ .

+2

Zeigen Sie Ihren tatsächlichen Code oder eine angemessene Verkürzung, die das gleiche Problem hat. –

+2

Was versuchst du eigentlich zu tun? Warum möchten Sie nach Ihrer Auswahl ein anderes CTE? – HoneyBadger

+0

Tatsächlich wird die gesamte Abfrage durch das Zusammenstellen von Unterabfragen in einem C# -Code erstellt, deshalb habe ich viele CTEs, die Abfragen wurden in Oracle mit CONNECT BY geschrieben, so dass ich sie in CTEs umwandelte ... @HoneyBadger – Platus

Antwort

2

Der Fehler ist ziemlich klar, Sie haben eine extra ).

myCTE) 

sollte

myCTE 
sein
+1

... Und ein zusätzliches Komma, und was ist mit der 'anotherCTE' nach die Auswahl. Wird nie funktionieren ... – HoneyBadger

+0

Dies korrigiert den Fehler, aber ich bekomme eine weitere Fehlermeldung im nächsten Komma ', anotherCTE', bekomme ich die Nachricht "Falsche Syntax in der Nähe ','". * @HoneyBadger – Platus

0

müssen Sie eine ; vor WITH Anweisung

+0

Nein, Sie nicht ** müssen, zu ... haben. – HoneyBadger

+2

Die WITH-Anweisung muss die erste Anweisung im Stapel sein, also das ";". Es ist nicht erforderlich, wenn davor nichts passiert. – Shawn

0

hinzuzufügen, ist ein extra ")" auf SELECT * FROM myCTE

WITH 
    table1 
     AS (QUERY1) 
    , table2 
     AS (QUERY2) 
    , myCTE (COLUMNS OF THE CTE) 
     AS (CTE_QUERY) 
     SELECT * FROM myCTE), 
    ,anotherCTE... 
1

Wie Sie bereits herausgefunden, die extra) nicht da sein sollte:

Der zweite Fehler, den Sie gemeldet haben, ist, weil Sie versuchen, ein anderes CTE nach Auswahl aus dem obigen CTE zu tun. Sie dürfen das nicht tun, aber beenden Sie das CTE mit einer SELECT Anweisung.

Wenn Sie irgendwie AnotherCTE für etwas brauchen, könnten Sie beschließen, dass es vor dem SELECT, indem er erklärt Ihnen bereits getan hat, wie so:

WITH 
table1 
    AS (QUERY1) 
, table2 
    AS (QUERY2) 
, myCTE (COLUMNS OF THE CTE) 
    AS (CTE_QUERY) 
,anotherCTE... 
SELECT * FROM myCTE 

jedoch, die Sie wirklich brauchen würde bedeuten, nicht anotherCTE zu anfangen mit. Wenn Sie es brauchen, bewegen Sie einfach die SELECT-Anweisung nach unten, um die letzte Anweisung in Ihrer Abfrage zu sein.

Verwandte Themen