为了账号安全,请及时绑定邮箱和手机立即绑定

SQLServer中的行偏移量

SQLServer中的行偏移量

潇潇雨雨 2019-06-25 17:05:29
SQLServer中的行偏移量SQLServer中是否有任何方法从给定的偏移量开始获取结果?例如,在另一种类型的SQL数据库中,可以这样做:SELECT * FROM MyTable OFFSET 50 LIMIT 25才能得到51-75的结果。此结构似乎不存在于SQLServer中。在不加载我不关心的所有行的情况下,我如何做到这一点?谢谢!
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我会避免使用SELECT *..指定实际需要的列,即使这些列可能都是。

SQLServer 2005+

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

SQLServer 2000

SQL Server 2000中大结果集的高效寻呼

一种更有效的大结果集寻呼方法


查看完整回答
反对 回复 2019-06-25
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

如果您要按顺序处理所有页面,那么只需记住上一页上看到的最后一个键值,然后使用TOP (25) ... WHERE Key > @last_key ORDER BY Key如果存在适当的索引以允许有效地查找该索引,则可以是最佳的执行方法-或API游标如果他们不这么做的话。

对于选择任意页面,SQLServer 2005-2008 R2的最佳解决方案可能是ROW_NUMBERBETWEEN

对于SQLServer 2012+,可以使用增强的命令这一需要的条款。

SELECT  *FROM     MyTable 
ORDER BY OrderingColumn ASC OFFSET  50 ROWS FETCH NEXT 25 ROWS ONLY

尽管这个选项的执行情况还有待观察。.


查看完整回答
反对 回复 2019-06-25
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

这是一种方法(SQL 2000)

SELECT * FROM(
    SELECT TOP (@pageSize) * FROM
    (
        SELECT TOP (@pageNumber * @pageSize) *
        FROM tableName 
        ORDER BY columnName ASC
    ) AS t1 
    ORDER BY columnName DESC) AS t2 
ORDER BY columnName ASC

这是另一种方法(Sql 2005)

;WITH results AS (
    SELECT 
        rowNo = ROW_NUMBER() OVER( ORDER BY columnName ASC )
        , *
    FROM tableName 
) SELECT * FROM resultsWHERE rowNo between (@pageNumber-1)*@pageSize+1 and @pageNumber*@pageSize


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 1273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信