Cómo recuperar el número total de filas de una consulta con TOP
-
03-07-2019 - |
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
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