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

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

Existe um método eficiente?

Graças

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top