Manteniéndolo simple y cómo hacer múltiples CTE en una consulta
Tengo esta consulta T-SQL simple, emite un montón 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 cuantos participantes participan en cada evento.
Mi solución a esto es agregar un CTE que agrupe los eventos programados y cuente el número de participantes.
Esto me permitirá unirme a esa información por evento programado. Manteniendo la consulta simple.
Me gusta 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?
Realmente me gustaría si pudiera tener múltiples CTE pero no puedo, ¿verdad? ¿Cuáles son mis opciones aquí?
Descarté vistas y hacer cosas en la capa de datos de la aplicación. Prefiero aislar mis consultas SQL.
Puede tener varios 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
es posible que se reevalúe CTE
cada vez que se acceda a él, por lo que si utiliza valores como RAND()
, NEWID()
etc., pueden cambiar entre las CTE
llamadas.
Ciertamente puede tener múltiples CTE en una sola expresión de consulta. Sólo necesitas separarlos con una coma. Aquí hay un ejemplo. En el siguiente ejemplo, hay dos CTE. Uno se nombra CategoryAndNumberOfProducts
y el segundo se nombra 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