Como recuperar a contagem total de linhas de uma consulta com TOP
-
03-07-2019 - |
Pergunta
Eu tenho uma consulta SQL Server 2008
SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...
Eu gostaria de ter também o número total de linhas. A maneira obious é fazer uma segunda consulta ??p>
SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
Existe um método eficiente?
Graças
Solução
Você quer uma segunda consulta?
SELECT TOP 10
*, foo.bar
FROM
T
CROSS JOIN
(SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
...
ORDER BY
...
ou
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
...
Or (Edit: usando COM)
WITH cTotal AS
(
SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
*, cTotal .bar
FROM
T
WHERE
...
ORDER BY
...
Outras dicas
O que é nesta resposta parece funcionar:
https://stackoverflow.com/a/19125458/16241
Basicamente você faz um:
SELECT top 100 YourColumns, TotalCount = Count(*) Over()
From YourTable
Where SomeValue = 32
TotalCount terá o número total de linhas. Ela está listada em cada linha embora.
Quando eu testei este plano a consulta mostrou a mesa sendo apenas batida uma vez.
Remova a cláusula ORDER BY da 2ª consulta também.
Não.
SQL Server
não mantém COUNT(*)
em metadados como MyISAM
, ele calcula que cada vez.
UPDATE: Se você precisar de uma estimativa, você pode usar as estatísticas de metadados:
SELECT rows
FROM dbo.sysindexes
WHERE name = @primary_key,
onde @primary_key
é nome da chave principal da sua mesa.
Isto irá devolver o COUNT(*)
de atualização últimas estatísticas.
SELECT TOP (2) *,
(SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM T