2017-06-12 89 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声明向下移动即可成为查询中的最终声明。