我有一个非常大的查询,它应该只返回前10个结果:
从.....
中选择前10名ProductId问题是我还想要符合条件的结果总数而没有“前10名”,但同时它被认为是无法返回所有行的(我们谈论的是大约10万个结果。) p>
有没有办法获得上一个查询影响的总行数,无论是在其中还是在后面而不再运行它?
PS:请不要有10万行的临时表:))
答案 0 :(得分:4)
将计数转储到变量中并返回
declare @count int
select @count = count(*) from ..... --same where clause as your query
--now you add that to your query..of course it will be the same for every row..
select top 10 ProductId, @count as TotalCount from .....
答案 1 :(得分:2)
假设您已经使用了ORDER BY子句(正确定义了“TOP 10”结果),那么您也可以使用相反的排序顺序添加ROW_NUMBER调用,并选择返回的最高值
例如,以下内容:
select top 10 *,ROW_NUMBER() OVER (order by id desc) from sysobjects order by ID
最后一列的值为2001,2000,1999等,降序。以下内容:
select COUNT(*) from sysobjects
确认sysobjects中有2001行。
答案 2 :(得分:0)
我想你可以用工会选择
来破解它select top 10 ... from ... where ...
union
select count(*) from ... where ...
为了逃避这种类型的黑客攻击,您需要在计数查询中添加假列,以便返回与主查询相同数量的列。例如:
select top 10 id, first_name from people
union
select count(*), '' as first_name from people
我不建议使用此解决方案。使用两个单独的查询是如何完成的
答案 3 :(得分:0)
一般来说否 - 推理如下:
如果(!),查询规划器可以使用TOP 10只返回10行,那么RDBMS甚至不知道满足完整标准的确切行数,它只是得到TOP 10.
因此,当您想要查找满足条件的所有行的计数时,您第二次没有运行它,而是第一次。
说过正确的索引可能会使两个查询执行得非常快。
修改强>
MySQL有SQL_CALC_FOUND_ROWS,如果没有应用LIMIT,则返回查询将返回的行数 - 在MS SQL中搜索等效的分析SQL和CTE变体,请参阅this forum(即使不确定)这两种方式都有资格只运行一次,但请随时查看 - 并告诉我们。)