2011-04-21 64 views
2

雖然我的查詢執行這一新概念Common Table ExpressionsSQL選擇:使用CTE爲數據集IN子句 - 語法錯誤

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的有效使用?
謝謝。

+0

這不是你如何引用一個CTE ..... – 2011-04-21 10:32:59

+0

在這裏你會找到答案http://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/ – 2011-04-21 10:35:28

+1

';'是SQL中的語句終結符 - 你將不會在語句中找到它。只是覺得我應該指出,因爲它可能會幫助你在未來圍繞類似的問題推理。 – 2011-04-21 10:37:50

回答

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工作了:

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

很難界定,其中WITH中使用這裏的第一或第二個陳述。

因此,最好的做法是始終在分號前添加WITH,以便您可以輕鬆地將其剪切並粘貼到代碼的任何位置,而無需擔心它是否是批處理中的第一條語句。

+0

+ 1.nice one ..... – 2011-04-21 10:35:33