2017-06-12 90 views
-2

我試圖使用具有以下結構的SQL查詢:CTE不正確的語法附近「)」

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

我收到一條「不正確的語法錯誤附近‘)’附近‘myCTE)’ 。

+2

顯示您的實際代碼或合理縮短它有相同的問題。 –

+2

你究竟在做什麼?爲什麼選擇後需要另一個CTE? – HoneyBadger

+0

實際上,整個查詢是通過在C#代碼中組裝子查詢來構建的,這就是爲什麼我有很多CTE,查詢是使用CONNECT BY在Oracle中編寫的,因此我將它們轉換爲CTE ... @HoneyBadger – Platus

回答

2

的錯誤是很清楚你有一個額外)

myCTE) 

應該

myCTE 
+1

...並附加一個逗號,以及'anotherCTE'之後的內容選擇。將永遠不會工作... – HoneyBadger

+0

這將更正錯誤,但我在下一個逗號'anotherCTE'中收到另一個錯誤消息,我收到消息「附近的語法錯誤,''。* @HoneyBadger – Platus

0

你必須添加一個;WITH聲明

+0

不,你不**不得不。 – HoneyBadger

+2

WITH語句必須是批處理中的第一條語句,即「;」。如果之前沒有發生任何事情,則不需要。 – Shawn

0

上有SELECT *一個額外的 「)」 FROM myCTE

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

正如你已經發現,多餘的)不應該有:

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

您報告的第二個錯誤是因爲您從上述CTE中選擇後嘗試執行另一個CTE。你不能這樣做,但結束CTE與SELECT聲明。

如果你以某種方式需要AnotherCTE什麼,你能解決的你已經做了,像這樣的SELECT事先聲明它:

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

然而,這將意味着你並不真的需要anotherCTE到首先。如果您確實需要它,只需將SELECT聲明向下移動即可成爲查詢中的最終聲明。