Pregunta

Tengo una consulta de SQL Server 2008

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

Me gustaría obtener también el número total de filas. La manera obvia es hacer una segunda consulta

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

¿Existe un método eficiente?

Gracias

¿Fue útil?

Solución

¿Quieres una segunda consulta?

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

O

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
    ...

O (Editar: usando WITH)

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

Otros consejos

Lo que está en esta respuesta parece funcionar:

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

Básicamente haces una:

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

TotalCount tendrá el número total de filas. Sin embargo, se enumera en cada fila.

Cuando probé esto, el plan de consulta mostró que la tabla solo fue golpeada una vez.

También elimine la cláusula ORDER BY de la segunda consulta.

No.

SQL Server no mantiene COUNT (*) en metadatos como MyISAM , lo calcula cada vez.

ACTUALIZACIÓN: Si necesita una estimación, puede usar metadatos de estadísticas:

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

donde @primary_key es el nombre de la clave principal de su tabla.

Esto devolverá el COUNT (*) de la última actualización de estadísticas.

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top