我有一个SQL Server 2008查询
SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...
我想得到总行数。好的方法是进行第二次查询
SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
有一种有效的方法吗?
由于
答案 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