我有一个SQL Server 2008查询

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

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

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

有一种有效的方法吗?

由于

有帮助吗?

解决方案

您想要第二个查询吗?

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

其他提示

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

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

基本上你做了:

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

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

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

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

没有

SQL Server 不会在 MyISAM 之类的元数据中保留 COUNT(*),它每次都会计算出来。

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

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

其中 @primary_key 是表的主键名。

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

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top