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

Resuelto John Leidegren asked hace 14 años • 2 respuestas

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.

John Leidegren avatar Jan 26 '10 23:01 John Leidegren
Aceptado

Puede tener varios CTEs 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 Serveres posible que se reevalúe CTEcada vez que se acceda a él, por lo que si utiliza valores como RAND(), NEWID()etc., pueden cambiar entre las CTEllamadas.

Quassnoi avatar Jan 26 '2010 16:01 Quassnoi

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 CategoryAndNumberOfProductsy 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
Randy Minder avatar Jan 26 '2010 16:01 Randy Minder