2016-02-03 57 views
1

我試圖建立一個偏移量和限制,我曾嘗試以下:SQL服務器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; 

,但我得到這個錯誤:

Invalid column name 'rownumber'.

請幫助。

+1

您不能在where子句中引用窗口函數。你將不得不將你的查詢移動到一個子查詢或者更多的查詢到一個cte。有一點格式化會對這個和所有的查詢有很大的幫助。所有這樣被搗毀是非常具有挑戰性的閱讀。 –

+0

你需要一個嵌套的查詢來使用rownumber –

回答

4

您應該爲查詢添加另一步驟。 ROW_NUMBER()不能在您定義它的相同查詢中使用,因此您必須將其全部包裝在另一個選擇中,如下所示。 where子句涉及FROM表/查詢中的所有字段,因此rownumber尚不存在。

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 
2

使用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 
2

在SQL 2012+可以使用ORDER BY子句中新OFFSET and 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. 

所以上面的查詢將返回行11 - 20,訂購SomeColumn

+0

我試過這個,並得到這個錯誤:'10'附近的語法不正確。 – user979331

+0

SQL Server 2014 – user979331

+0

我忘了添加ORDER BY,但是當我這樣做時我得到這個錯誤:Msg 102,Level 15,State 1,Line 2 錯誤的'OFFSET'附近的語法。 消息153,級別15,狀態2,行2 FETCH語句中的選項NEXT的使用無效。 – user979331

1

下面是一個版本使用偏移量和提取,下面的代碼將忽略前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;