SQL选择:使用CTE作为IN子句的数据集 - 语法错误

时间:2011-04-21 10:31:37

标签: sql-server-2005 select common-table-expression sql

在我的查询中实现这个新想法Common Table Expressions

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的有效用法吗?
感谢。

1 个答案:

答案 0 :(得分:5)

WITH    CTEName as
        (
        -- CTE syntax goes here
        )
SELECT  *
FROM    mytable
WHERE   myfield IN 
        (
        SELECT  ctefield
        FROM    CTEName
        )
GROUP BY
        myotherfield

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

另请注意,通常不需要分号(;)。但是,CTE语法在SQL Server已经为其自身目的引入关键字WITH后实现,因此隐式语句中断不再适用于CTE:< / p>

SELECT  *
FROM    mytable
WITH    q AS (SELECT 1)
SELECT  *
FROM    q

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

因此,最好始终在WITH前添加分号,以便您可以轻松地将其剪切并粘贴到代码中的任何位置,而不必担心它是否是批处理中的第一个语句