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

我的数据模型很简单。我有个安排好的活动,有参与者。我需要知道每个活动有多少人参加。

对此,我的解决方案是添加一个CTE,它对计划的事件进行分组并计算参与者的数量。

这将允许我在每个预定的事件中加入该信息。保持查询的简单性。

我喜欢保持我的查询简单,但是,如果我在未来需要在我的简单查询期间有额外的临时结果可访问,我该怎么办?

我真的很想,如果我能有多个cte但是我不能,对吧?我在这里有什么选择?

我已经排除了视图和在应用程序数据层进行操作。我更喜欢隔离我的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时重新计算CTE,因此如果您使用RAND(), NEWID()等值,它们可能会在CTE调用之间更改。


您当然可以在一个查询表达式中包含多个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