Подтвердить что ты не робот

Хранение его просто и как сделать несколько CTE в запросе

У меня есть этот простой запрос T-SQL, он выдает кучу столбцов из таблицы, а также объединяет информацию из других связанных таблиц.

Моя модель данных проста. У меня запланировано мероприятие с участниками. Мне нужно знать, сколько участников участвует в каждом мероприятии.

Мое решение состоит в том, чтобы добавить CTE, который группирует запланированные события и подсчитывает количество участников.

Это позволит мне присоединиться к этой информации за запланированное событие. Простой запрос.

Мне нравится, когда мои запросы просты, однако, если я когда-либо в будущем должен иметь дополнительные временные результаты, доступные во время моего простого запроса, что мне делать?

Мне бы очень понравилось, если бы у меня было несколько CTE, но я не могу, не так ли? Какие у меня варианты?

Я исключил представления и делал вещи на уровне данных приложения. Я предпочитаю изолировать свои SQL-запросы.

4b9b3361

Ответ 1

Вы можете иметь несколько 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.

Ответ 2

Вы, безусловно, можете иметь несколько 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