保持简单,以及如何在查询中执行多个CTE

我有这个简单的T-SQL查询,它从一个表中发出一堆列,并且还从其他相关表中join信息。

我的数据模型很简单。 我有一个预定的活动,与参与者。 我需要知道每个事件有多less参与者。

我的解决scheme是添加一个CTE,将预定事件分组,并统计参与者的数量。

这将允许我参加每个预定活动的信息。 保持查询简单。

但是,如果我将来需要在简单查询期间添加其他临时结果,我该怎么办?

我真的很喜欢它,如果我可以有多个CTE,但我不能,对不对? 我在这里有什么select?

我排除了应用程序数据层的视图和做事情。 我宁愿孤立我的SQL查询。

您可以在一个查询中使用多个CTE ,也可以重用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调用之间改变。

您当然可以在一个查询expression式中拥有多个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