2009-01-28 38 views
13

我需要做這樣的事情,但SQL Server 2008不喜歡它。我的查詢實際上比這更復雜,我意識到這不是完成我在做什麼的最好方法,但我的重點是WITH語句的功能,而不是select和where語句。可以在TSQL中兩次使用WITH來篩選結果集,就像我的示例一樣?

與stuff1 AS

( 選擇名稱,開始日期,編號從員工那裏開始日期> 0)

WITH stuff2 AS( 選擇名稱,開始日期,編號從stuff1)

SELECT * FROM stuff2其中id> 10

+0

Theres在使用臨時表格或表格變量時不需要任何羞愧 – Juliet 2009-01-28 20:07:19

回答

29

我做這一切的時候:

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 

至於我可以告訴大家,我還沒有達到在熱膨脹係數的限制。

你不能這樣做的唯一的事情(這將是非常有用的)是獨立的SELECT小號重用熱膨脹係數:

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 
; 
SELECT * 
FROM stuff2 
WHERE id < 10 

說。相反,您必須再次複製並粘貼整個CTE鏈。

-3

不,你可以在一個聲明中只有一個CTE,因爲我在前幾天發現。

編輯:那WITH語句是一個公共表表達式,非常方便的功能。

+0

實際上,您可以擁有多個CTE,並且它們可以互相構建,甚至可以在CTE鏈中構建多個CTE,使用逗號分隔 - 只有一個WITH語句可以使用。 – 2009-01-28 21:04:49

+0

我沒有意識到他們必須用逗號分隔。這將很方便。我一直在閱讀我的SQL 2008書,他們提到了CTE,但他們沒有提到在一個查詢中使用多個CTE,這是一個恥辱。 – Kezzer 2009-01-28 21:24:33

+0

是的,我在下面發佈了一個例子。去年我在3GL系統的一個端口上使用它非常繁重。 – 2009-01-28 21:28:41

0

您可以向我們提供一系列的子查詢。 嵌套在CTE中的子查詢。

子查詢的示例使用羅斯文:

SELECT * FROM 
    (SELECT * FROM 
     (SELECT * FROM dbo.Employees WHERE Country = 'USA') as TableFiltered1 
    ) AS TableFilterd2 WHERE City = 'Seattle' 

您可以使用兩種熱膨脹係數,但也許不是你想,看到的樣子:
http://www.4guysfromrolla.com/webtech/071906-1.shtml