with subconsultas recursivas query ejemplos cte consultas sql-server tsql common-table-expression

sql-server - subconsultas - with sql server



Manteniéndolo simple y cómo hacer múltiples CTE en una consulta (2)

Tengo esta simple consulta T-SQL, emite un grupo de columnas de una tabla y también une información de otras tablas relacionadas .

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 agrupe eventos programados y cuente el número de participantes.

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

Sin embargo, me gustaría mantener mis consultas simples. Si alguna vez en el futuro necesito tener acceso a resultados temporales adicionales durante mi simple consulta, ¿qué debo hacer?

Realmente me gustaría, si pudiera tener múltiples CTE pero no puedo, ¿verdad? ¿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.


Ciertamente 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


Puede tener múltiples 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

Sin embargo, tenga en cuenta que SQL Server puede reevaluar el CTE cada vez que se accede, por lo que si está utilizando valores como RAND() , NEWID() , etc., pueden cambiar entre las llamadas CTE .