2010-01-26 104 views
79

我有這個簡單的T-SQL查詢,它從一個表中發出一堆列,並且還加入了其他相關的表中的信息。保持簡單,以及如何在查詢中執行多個CTE

我的數據模型很簡單。我有一個預定的活動,與參與者。我需要知道有多少參與者參加每個活動。

我對此的解決方案是添加一個CTE,將預定事件分組並計算參與者數量。

這將允許我加入每個預定事件的信息。保持查詢簡單。

但是,如果我將來需要在我的簡單查詢期間獲得更多的臨時結果,我該怎麼辦?

我真的很喜歡它,如果我可以有多個CTE但我不能,對嗎?我在這裏有什麼選擇?

我排除了應用程序數據層的視圖和事情。我寧願孤立我的SQL查詢。

回答

158

你可以有多個CTE S IN一個查詢,以及重複使用CTE

WITH cte1 AS 
     (
     SELECT 1 AS id 
     ), 
     cte2 AS 
     (
     SELECT 2 AS id 
     ) 
SELECT * 
FROM cte1 
UNION ALL 
SELECT * 
FROM cte2 
UNION ALL 
SELECT * 
FROM cte1 

但是請注意,這SQL Server可以在每次訪問時重新評估CTE,因此,如果您使用的值像RAND(),NEWID()等,他們可能會改變CTE之間的調用。

+1

就這麼簡單。 MSDN文檔在這個問題上有點模糊,我找不到任何結論。非常感謝你! – 2010-01-26 16:27:57

+1

它記錄在[WITH common_table_expression(Transact-SQL)](http://msdn.microsoft.com/zh-cn/library/ms175972.aspx)中。你可以看到它在語法部分(特別注意'[WITH [,... n]]'中的'[,... n]'。例C「在多個CTE定義中使用一個單一的查詢「,會明確地調用它,可悲的是,這個例子在SQL 2008和更舊版本的文檔中沒有提供(例如,當OP發佈這個問題時沒有提供這個例子) – Brian 2014-07-10 15:01:15

51

您當然可以在一個查詢表達式中擁有多個CTE。你只需要用逗號分隔它們。這是一個例子。在下面的例子中,有兩個CTE。一個被命名爲CategoryAndNumberOfProducts,另一個被命名爲ProductsOverTenDollars

WITH CategoryAndNumberOfProducts (CategoryID, CategoryName, NumberOfProducts) AS 
(
    SELECT 
     CategoryID, 
     CategoryName, 
     (SELECT COUNT(1) FROM Products p 
     WHERE p.CategoryID = c.CategoryID) as NumberOfProducts 
    FROM Categories c 
), 

ProductsOverTenDollars (ProductID, CategoryID, ProductName, UnitPrice) AS 
(
    SELECT 
     ProductID, 
     CategoryID, 
     ProductName, 
     UnitPrice 
    FROM Products p 
    WHERE UnitPrice > 10.0 
) 

SELECT c.CategoryName, c.NumberOfProducts, 
     p.ProductName, p.UnitPrice 
FROM ProductsOverTenDollars p 
    INNER JOIN CategoryAndNumberOfProducts c ON 
     p.CategoryID = c.CategoryID 
ORDER BY ProductName 
+2

@JohnLeidegren:發佈一個正確的答案在第一個正確答案的2分鐘內,值得讚揚,至少我已經給出了 – 2012-03-20 15:52:17

+0

這是多麼毫無意義的評論。「SO(stackoverflow)是相當嚴格的調節」 - 幸好這個人不是主持人之一。 – 2015-09-07 13:18:01