如何使用TOP检索查询的总行数
-
03-07-2019 - |
题
我有一个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
不隶属于 StackOverflow