Я определил способ получения быстро выгружаемых результатов из базы данных с помощью 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, я не могу поместить его во второй набор результатов.