高效方案:使用COUNT(*) OVER()窗口函数结合分页,避免两次查询。代码示例:SELECT *, COUNT(*) OVER() AS TotalCount FROM (SELECT TOP 10 * FROM Table1 ORDER BY Id) t ORDER BY Id; 这就是网友最推荐的实用技巧,一次查询搞定总数和分页数据,超级轻松解决统计难题。
网友分享1
我用的是这种方法,COUNT OVER()真香!以前分页总要查两次,一次总数一次数据,现在一次OK。SELECT *, (SELECT COUNT(*) FROM Table1) AS Total FROM Table1 ORDER BY Id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY; 不,窗口函数更好,不用子查询。
网友分享2
窗口函数是王道!在SQL Server 2012+版本,SELECT Column1, Column2, COUNT(*) OVER() TotalCount FROM YourTable ORDER BY SomeColumn OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY; 总数直接带出来,前端分页轻松实现,不用额外请求。
网友分享3
实用技巧:如果表很大,别用COUNT(*)全表,会慢。用索引优化,或者COUNT(1) WHERE条件相同。完整代码:WITH CTE AS (SELECT *, ROW_NUMBER() OVER(ORDER BY Id) rn FROM Table1 WHERE condition) SELECT *, (SELECT COUNT(*) FROM CTE) total FROM CTE WHERE rn BETWEEN 1 AND 10; 但窗口函数更简洁。
网友分享4
我推荐这个,超高效:DECLARE @PageSize INT=10, @PageIndex INT=1; SELECT *, COUNT(*) OVER() AS TotalRecords FROM Table1 ORDER BY CreateTime DESC OFFSET (@PageIndex-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY; 测试百万数据,秒出结果!
网友分享5
别忽略索引!在ORDER BY字段加索引,分页飞起。代码同上,COUNT(*) OVER()是神器,网友都说比Keyset分页还简单,轻松统计总数。
网友分享6
老版本SQL Server,用TOP和子查询:SELECT *, (SELECT COUNT(*) FROM Table1) cnt FROM (SELECT TOP 10 * FROM Table1 ORDER BY Id DESC) t ORDER BY Id; 但新版窗口函数无敌。
FAQ
Q: 为什么不用两次查询?
A: 两次查询在大数据量下性能差,窗口函数一次搞定。
Q: 窗口函数支持哪个版本?
A: SQL Server 2005+支持OVER(),2012+完美分页。
Q: 总数怎么前端显示?
A: 直接从TotalCount字段取,用在分页控件。
Q: 表超大怎么办?
A: 加WHERE条件+索引,测试用EXPLAIN看计划。