保持简单,以及如何在查询中执行多个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