SQL Server OFFSET 和 LIMIT

3

我正在尝试设置偏移量(Offset)和限制数量(Limit),我已经尝试了以下方法:

SELECT
    [Job_No]
,   ROW_NUMBER() OVER (ORDER BY [Job_No]) AS [rownumber]
,   [BaselineStart]
,   [BaselineFinish]
,   [ExpectedStart]
,   [ExpectedFinish]
,   [ScheduledStart]
,   [ScheduledFinish]
,   [ActualStart]
,   [ActualFinish]
FROM
    [Schedule]
WHERE
    [rownumber] BETWEEN 10 AND 20;

但是我遇到了这个错误:

无效的列名 'rownumber'。

请帮忙解决。

1
在where子句中不能引用窗口函数。你需要将查询移到子查询或者将其移动到CTE中。稍微进行一些格式化会对你的所有查询都有很大帮助。所有东西都挤在一起阅读起来非常困难。 - Sean Lange
你需要使用嵌套查询才能使用rownumber。 - Ben Rhys-Lewis
4个回答

7

在SQL 2012及以上版本中,您可以在ORDER BY子句中使用新的OFFSET和FETCH NEXT参数:

SELECT Columns
FROM MyTable
ORDER BY SomeColumn
OFFSET 10 ROWS --this means start with row 11
FETCH NEXT 10 ROWS ONLY  --this means limit the results to the next 10 rows.

因此,上述查询将返回按SomeColumn排序的第11-20行。


我尝试了这个,但是出现了错误:'10' 附近的语法不正确。 - user979331
我忘记添加ORDER BY,但是当我添加后,出现了以下错误:Msg 102,Level 15,State 1,Line 2 'OFFSET'附近的语法不正确。 Msg 153,Level 15,State 2,Line 2 在FETCH语句中,选项NEXT的使用无效。 - user979331
肯定是另一个打字错误,我的示例在语法上是正确的。 - Tab Alleman

5
你应该在查询中添加另一步骤。 ROW_NUMBER() 不能在定义它的同一查询中使用,因此您必须像下面一样将其全部包装在另一个 select 中。where 子句涉及 FROM 表/查询中的所有字段,因此行号还不存在。
select * from
(SELECT Job_No,
        ROW_NUMBER() OVER(ORDER BY Job_No) AS rownumber,
        BaselineStart, BaselineFinish, ExpectedStart, ExpectedFinish,
        ScheduledStart, ScheduledFinish, ActualStart, ActualFinish
        FROM Schedule)
WHERE rownumber BETWEEN 10 AND 20

3

从SQLServer 2012版本开始,不需要指定版本号

以下是使用偏移量和获取数据的代码示例,该代码将忽略前10行并获取按jobno排序的接下来的10行数据

SELECT Job_No, 
      BaselineStart, 
   BaselineFinish, 
   ExpectedStart, 
   ExpectedFinish, 
   ScheduledStart, 
   ScheduledFinish, 
   ActualStart, 
   ActualFinish 
FROM Schedule
order by job_no
offset  10 rows fetch next 10 rows only;

1
@Dika: 我更新了我的回答以反映这一点 - TheGameiswar

2

Using CTE

WITH Result AS 
(
SELECT Job_No, 
   ROW_NUMBER() OVER(ORDER BY Job_No) AS rownumber, 
   BaselineStart, 
   BaselineFinish, 
   ExpectedStart, 
   ExpectedFinish, 
   ScheduledStart, 
   ScheduledFinish, 
   ActualStart, 
   ActualFinish 
FROM Schedule
)
SELECT  *
FROM    Result
WHERE   rownumber BETWEEN 10 AND 20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接