Как мне получить количество строк для cte в отдельном наборе данных?

Я определил способ получения быстро выгружаемых результатов из базы данных с помощью CTE и функции Row_Number следующим образом ...

DECLARE @PageSize INT = 1
DECLARE @PageNumber INT = 2

DECLARE @Customer TABLE (
  ID       INT IDENTITY(1, 1),
  Name     VARCHAR(10),
  age      INT,
  employed BIT)

INSERT INTO @Customer
    (name,age,employed)
SELECT 'bob',21,1
    UNION ALL
SELECT 'fred',33,1
    UNION ALL
SELECT 'joe',29,1
    UNION ALL
SELECT 'sam',16,1
    UNION ALL
SELECT 'arthur',17,0;


WITH cteCustomers
     AS ( SELECT
            id,
            Row_Number( ) OVER(ORDER BY Age DESC) AS Row
          FROM   @Customer
          WHERE  employed = 1 
     /*Imagine I've joined to loads more tables with a really complex where clause*/
     )       

SELECT
  name,
  age,
  Total = ( SELECT
              Count( id )
            FROM   cteCustomers )
FROM       cteCustomers
INNER JOIN @Customer cust
  /*This is where I choose the columns I want to read, it returns really fast!*/
  ON cust.id = cteCustomers.id
WHERE      row BETWEEN ( @PageSize * @PageNumber - 1 ) AND ( @PageSize * ( @PageNumber ) )
ORDER      BY row ASC

Используя этот метод, возвращаемые результаты выглядят так: действительно очень быстро даже при сложных объединениях и фильтрах.

Чтобы выполнить разбиение на страницы, мне нужно знать Всего строк, возвращаемых полным CTE. Я сделал это "Bodged", поместив столбец, который его содержит

Total = ( SELECT
              Count( id )
            FROM   cteCustomers )

Есть ли лучший способ вернуть сумму в другом наборе результатов, не помещая ее в столбец? Поскольку это CTE, я не могу поместить его во второй набор результатов.

6
задан digiguru 24 May 2011 в 14:48
поделиться