获取SQL结果部分

时间:2011-05-26 19:28:21

标签: sql sql-server-2008 query-optimization

我知道我可以使用TOP关键字来限制收到结果的数量,但有没有办法使用类似<give me the next 1000 results>的内容接收下一个1000个结果缓存了1000个?

假设我的查询有100000,第一次运行我得到1-1000我希望收到1000-2000等等。

4 个答案:

答案 0 :(得分:5)

当数据在查询之间变化时,rownum / between解决方案将为您提供下一个数据块的近似值。

如果需要从固定结果中获取特定数据块,请将所有结果插入表中,然后根据需要使用数据。结果将保持不变,直到您再次刷新表中的数据为止。

当你必须得到确切的下一组(向前或向后)时,这很有效。根据您的具体情况,这可能很有用。

答案 1 :(得分:3)

您可以使用ROW_NUMBER()

SELECT 
    col1, 
    col2 
FROM 
(
     SELECT 
         col1, 
         col2, 
         ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
     FROM 
        MyTable
) AS MyDerivedTable
WHERE 
    MyDerivedTable.RowNum BETWEEN @startRow AND @endRow

答案 2 :(得分:0)

使用ROW_NUMBER功能根据需要在子查询或CTE中对数据进行排序。然后从具有所需值的子查询/ CTE中选择(例如,WHERE RowNum > 1000 AND RowNum <= 2000)。

答案 3 :(得分:0)

假设有以下表格

create table #temp
(
    ID int Identity(1,1) ,
    name varchar(1000)
)

假设表格中有以下记录

select * from #temp

Total records

我们首先声明以下变量

Declare @PageIndex INT //表示起始索引,表示您的页码

Declare @PageSize INT //您希望在页面中显示的记录总数

Set @PageIndex = 1
Set @PageSize = 10

我正在设置页面大小= 10,因为我的表中只有15条记录。但您可以将此数字替换为1000或甚至大于此数字。

SELECT * FROM 
(
        SELECT ROW_NUMBER() OVER (ORDER BY ID)
        AS Row, * FROM #temp
)T WHERE Row between 
(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize

如果您执行以下查询,它将在屏幕截图中为您提供以下记录。

Result from query

使用以下查询移至第二页。

Declare @PageIndex INT
Declare @PageSize INT

set @PageIndex = 2
set @PageSize = 10

SELECT * FROM 
(
   SELECT ROW_NUMBER() OVER (ORDER BY ID)
   AS Row, * FROM #temp
)T WHERE Row between 
(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize

结果将在屏幕截图中显示。

enter image description here

所以类似地你可以检查1000条记录。

希望这会对你有所帮助。

如果有任何混淆,请告诉我。