Сохраняя его простым и как сделать несколько CTE в запросе


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

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

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

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

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

Мне бы очень хотелось, если бы у меня было несколько CTEs, но я не могу, верно? Какие у меня здесь варианты?

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

2 97

2 ответа:

вы можете иметь несколько 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() etc. они могут меняться между 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