Как получить общее количество строк запроса с помощью TOP
-
03-07-2019 - |
Вопрос
У меня есть запрос 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