Mantendo-o simples e como fazer vários CTE em uma consulta
Tenho esta simples consulta T-SQL, que emite um monte de colunas de uma tabela e também junta informações de outras tabelas relacionadas com.
O meu modelo de dados é simples. Tenho um evento agendado, com participantes. Preciso de saber quantos participantes participam em cada evento.a minha solução para isto é adicionar um CTE que agrupa eventos agendados e conta o número de participantes.
Isto permitir-me-á juntar-me a essa informação por evento agendado. Manutencao a consulta simples. [[1]} Eu gosto de manter minhas consultas simples, no entanto, se eu alguma vez no futuro precisar de ter resultados adicionais temporários acessíveis durante a minha simples consulta, o que eu faço? Eu gostaria muito, se pudesse ter vários Eti, mas não posso, certo? Quais são as minhas opções? Já descartei visões e fiz coisas na camada de dados da aplicação. Prefiro isolar as minhas consultas SQL.2 answers
Você pode ter múltiplos CTE
s em uma consulta, bem como reutilizar um 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
Note, No entanto, que SQL Server
pode reavaliar o CTE
cada vez que é acedido, por isso se estiver a usar valores como RAND()
, NEWID()
etc., eles podem mudar entre as chamadas.
Você certamente é capaz de ter vários CTE em uma única expressão de consulta. Só tens de os separar com uma vírgula. Aqui está um exemplo. No exemplo abaixo, há dois CTE. um é nomeado CategoryAndNumberOfProducts
e o segundo é nomeado 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