如何使用TOP检索查询的总行数

时间:2009-03-04 14:58:57

标签: sql-server count pagination aggregate

我有一个SQL Server 2008查询

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

我想得到总行数。好的方法是进行第二次查询

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

有一种有效的方法吗?

由于

5 个答案:

答案 0 :(得分:4)

您想要第二个查询吗?

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

OR

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)

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

答案 1 :(得分:2)

这个答案中的内容似乎有效:

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

基本上你做了:

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

TotalCount将具有总行数。它列在每一行上。

当我测试这个时,查询计划显示该表只被击中一次。

答案 2 :(得分:1)

也从第二个查询中删除ORDER BY子句。

答案 3 :(得分:1)

没有

SQL Server未将COUNT(*)保留在MyISAM等元数据中,每次都会计算出来。

更新:如果您需要估算,可以使用统计元数据:

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

其中@primary_key是您表格的主键名称。

这将从上次统计信息更新中返回COUNT(*)

答案 4 :(得分:0)

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T