Как получить общее количество строк запроса с помощью TOP - PullRequest
4 голосов
/ 04 марта 2009

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

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

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

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

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

Спасибо

Ответы [ 5 ]

4 голосов
/ 04 марта 2009

Хотите второй запрос?

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

OR

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)

WITH cTotal AS
(
    SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
    *, cTotal .bar
FROM
    T
WHERE
    ...
ORDER BY
    ...
2 голосов
/ 28 июля 2015

Что в этом ответе, кажется, работает:

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

В основном вы делаете:

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

TotalCount будет иметь общее количество строк. Хотя он указан в каждом ряду.

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

1 голос
/ 04 марта 2009

номер

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

ОБНОВЛЕНИЕ: Если вам нужна оценка, вы можете использовать метаданные статистики:

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

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

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

1 голос
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009
SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
...