Как получить общее количество строк запроса с помощью TOP

StackOverflow https://stackoverflow.com/questions/610932

Вопрос

У меня есть запрос SQL Server 2008

SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...

Я хотел бы также получить общее количество строк.Самый простой способ - сделать второй запрос

SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...

Есть ли эффективный метод?

Спасибо

Это было полезно?

Решение

Вам нужен второй запрос?

SELECT TOP 10
    *, foo.bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

или

DECLARE @bar int
SELECT @bar = COUNT(*) AS bar FROM T WHERE ...
SELECT TOP 10
    *, @bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

Или (Редактировать:использование С)

WITH cTotal AS
(
    SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
    *, cTotal .bar
FROM
    T
WHERE
    ...
ORDER BY
    ...

Другие советы

То, что содержится в этом ответе, похоже, работает:

https://stackoverflow.com/a/19125458/16241

По сути, вы делаете:

SELECT top 100 YourColumns, TotalCount = Count(*) Over()
From YourTable
Where SomeValue = 32

totalCount будет содержать общее количество строк.Однако он указан в каждой строке.

Когда я тестировал это, план запроса показывал, что таблица была задана только один раз.

Удалите также предложение ORDER BY из 2-го запроса.

Нет.

SQL Server не удерживает COUNT(*) в метаданных, таких как MyISAM, он вычисляет это каждый раз.

Обновить: Если вам нужна оценка, вы можете использовать статистические метаданные:

SELECT  rows
FROM    dbo.sysindexes
WHERE   name = @primary_key,

где @primary_key это имя первичного ключа вашей таблицы.

Это вернет COUNT(*) из последнего обновления статистики.

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top