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.

Author: John Leidegren, 0000-00-00

2 answers

Você pode ter múltiplos CTEs 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.

 191
Author: Quassnoi, 2016-03-31 11:57:53

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
 65
Author: Randy Minder, 2014-03-31 04:23:52