Сохраняя его простым и как сделать несколько CTE в запросе
У меня есть этот простой T-SQL запрос, он выдает кучу столбцов из таблицы, а также соединяет информацию из других по теме таблицы.
моя модель данных проста. У меня запланированное мероприятие, с участниками. Мне нужно знать, сколько участников участвует в каждом мероприятии.
мое решение - добавить CTE, который группирует запланированные события и подсчитывает количество участников.
Это позволит мне присоединиться к этой информации в запланированное мероприятие. Сохраняя запрос простым.
Мне нравится, чтобы мои запросы были простыми, однако, если мне когда-либо в будущем понадобятся дополнительные временные результаты, доступные во время моего простого запроса, что мне делать?
Мне бы очень хотелось, если бы у меня было несколько CTEs, но я не могу, верно? Какие у меня здесь варианты?
Я исключил представления и делать вещи на уровне данных приложения. Я предпочитаю изолировать свои SQL-запросы.
2 ответа:
вы можете иметь несколько
CTEs в одном запросе, а также повторно использовать aCTE: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