198

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

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

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

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

我喜欢让我的查询保持简单,但是,如果我将来需要在我的简单查询期间访问其他临时结果,我该怎么办?

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

我已经排除了应用程序数据层的视图和处事。我更喜欢隔离我的 SQL 查询。

4

2 回答 2

388

您可以在一个查询中有多个CTEs,也可以重用 a 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调用之间发生变化。

于 2010-01-26T16:24:33.047 回答
112

您当然可以在单个查询表达式中拥有多个 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
于 2010-01-26T16:26:13.450 回答