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
.