Sql server 2005 SQL Select:使用CTE作为IN子句的数据集-语法错误

Sql server 2005 SQL Select:使用CTE作为IN子句的数据集-语法错误,sql-server-2005,select,common-table-expression,sql,Sql Server 2005,Select,Common Table Expression,Sql,在我的查询中实现此新想法时,请使用公共表表达式: SELECT ..... FROM .... WHERE ... IN ( ;with CTEName as ( CTE syntax goes here ) SELECT .... FROM CTEName ) GROUP BY .... 仍在获取以下查询错误: Msg 102, Level 15, State 1, Line 4 Incorrect syntax near ';'. Msg 102, L

在我的查询中实现此新想法时,请使用公共表表达式:

SELECT ..... FROM .... WHERE ... IN 
(
 ;with CTEName as
   (
      CTE syntax goes here
   )
     SELECT .... FROM CTEName
)
GROUP BY ....
仍在获取以下查询错误:

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ';'.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near ')'.
这是CTE的有效用法吗? 谢谢

换句话说,CTE应该在所有其他命令之前定义,就像它们是实际的表一样

还要注意分号;通常不需要。但是,CTE语法是在SQL Server出于自身目的引入关键字WITH之后在SQL Server中实现的,因此隐式语句中断不再适用于CTE:

这里很难定义在第一个或第二个语句中使用WITH的位置


因此,始终使用分号作为前缀被认为是一种最佳做法,这样您就可以轻松地将其剪切并粘贴到代码中的任何位置,而不必担心它是否是批处理中的第一条语句。

这不是引用CTE的方式。……在这里您可以找到答案;语句终止符在SQL中,您将永远不会在语句的中间找到它。我想我应该指出这一点,因为这可能有助于你在未来思考类似的问题。
WITH    CTEName as
        (
        -- CTE syntax goes here
        )
SELECT  *
FROM    mytable
WHERE   myfield IN 
        (
        SELECT  ctefield
        FROM    CTEName
        )
GROUP BY
        myotherfield
SELECT  *
FROM    mytable
WITH    q AS (SELECT 1)
SELECT  *
FROM    q