2014-05-08 44 views
0

這是一個查詢,我將分頁數據返回到我的web應用程序以獲取前100個元素:SQL Server分頁查詢錯誤 - ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效

SELECT * FROM (SELECT ROWNUM AS RN, Id,DateTime FROM Schema.MyDb WHERE 
Deleted='F' AND (Code>=2) AND (Type LIKE '%stock%') 
ORDER BY Datetime DESC) WHERE ROWNUM < 
100 AND RN > 0 

這工作很細的Oracle數據庫上,但SQL Server下運行2012 I'm得到以下錯誤時:

Message 1033, Level 15, State 1, Server NBOOK\SQLEXPRESS, Line 1: 

The ORDER BY clause is invalid in views, inline functions, derived tables, subqu 
eries, and common table expressions, unless TOP, OFFSET or FOR XML is also speci 
fied. 

就如何解決這一問題,並使其工作沒有任何提示失去邏輯(最終的結果需要是or的100個第一行否認查詢)?

感謝您的幫助。

回答

3

rownum特定於Oracle。在SQL Server(和Oracle),你應該使用row_number()代替:

SELECT * 
FROM (SELECT row_number() over (order by DateTime desc) as RN, Id, DateTime 
     FROM Schema.MyDb 
     WHERE Deleted = 'F' AND (Code >= 2) AND (Type LIKE '%stock%') 
    ) t 
WHERE RN < 100 AND RN > 0; 

此外,子查詢需要在SQL Server的別名。以上將在兩個數據庫中工作。

+0

不會造成查詢開銷,因爲它是一個分析函數?這個查詢將在我的服務器上經常被調用... – Mendes

+0

@Mendez。 。 。是的,有點。它不應該比'by order'更糟糕。你可以在SQL Server上使用'top'。答案中的版本適用於兩個數據庫。 –

+0

在SQLServer和Oracle中均可正常工作。感謝幫助! – Mendes

1

您的訂單是在子查詢中。把它拿出來,你應該很好。

相關問題