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