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