2010-01-26 15 views
79

Tengo esta simple consulta T-SQL, emite un grupo de columnas de una tabla y también se une a la información de otras relacionadas con las tablas.Manteniéndolo simple y cómo hacer múltiples CTE en una consulta

Mi modelo de datos es simple. Tengo un evento programado, con participantes. Necesito saber cuántos participantes participan en cada evento.

Mi solución a esto es agregar un CTE que agrupa eventos programados y cuenta el número de participantes.

Esto me permitirá unirme a esa información por evento programado. Manteniendo la consulta simple.

Me gustaría mantener mis consultas simples, sin embargo, si alguna vez en el futuro necesito tener resultados temporales adicionales accesibles durante mi consulta simple, ¿qué debo hacer?

Me gustaría mucho, si pudiera tener varios CTE pero no puedo, ¿no? ¿Cuáles son mis opciones aquí?

He descartado vistas y cosas en la capa de datos de la aplicación. Prefiero aislar mis consultas SQL.

Respuesta

158

Puede tener varias CTE s en una consulta, así como reutilizar un 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 

Tenga en cuenta, sin embargo, que SQL Server puede reevaluar la CTE cada vez que se accede, por lo que si usted está usando los valores como RAND(), NEWID() etc., pueden cambiar entre las llamadas CTE.

+1

Fue así de simple. la documentación de MSDN estaba un poco confusa sobre el tema, no pude encontrar nada concluyente. ¡Muchas gracias! –

+1

Está documentado en [WITH common_table_expression (Transact-SQL)] (http://msdn.microsoft.com/en-us/library/ms175972.aspx). Puede ver que están en la sección de sintaxis (tome nota especial de '[, ... n]' en '[CON [, ... n]]'. Ejemplo C, "Uso de múltiples definiciones CTE en una sola consulta, "lo llama explícitamente. Lamentablemente, este ejemplo no se proporciona en la documentación para SQL 2008 y anteriores (es decir, el ejemplo no se proporcionó cuando el OP publicó la pregunta). – Brian

51

Sin duda puede tener múltiples CTE en una sola expresión de consulta. Solo necesitas separarlos con una coma. Aquí hay un ejemplo. En el ejemplo a continuación, hay dos CTE. Uno se llama CategoryAndNumberOfProducts y el segundo se llama 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 
+2

@JohnLeidegren: publicar una respuesta correcta dentro de los 2 minutos de la primera respuesta correcta merece un voto positivo, que he dado, al menos. –

+0

Qué comentario sin sentido. "SO (stackoverflow) está muy moderado" - y afortunadamente este tipo no es uno de los moderadores. –

Cuestiones relacionadas