2011-09-26 72 views
0

我整個週末一直在與這個戰鬥,並且沒有想法。爲了在我的網站上在我的搜索結果中包含頁面,我需要從SQL Server 2005 Express數據庫中返回一部分行(即從第20行開始,然後給我下20條記錄)。在MySQL中,您可以使用「LIMIT」關鍵字來選擇要開始的行和返回的行數。沒有row_number()或嵌套子查詢的SQL Server分頁?

在SQL Server中,我發現ROW_NUMBER()/ OVER,但是當我嘗試使用它時,它說「Over not supported」。我想這是因爲我正在使用SQL Server 2005 Express(免費版)。任何人都可以驗證這是否屬實,或者如果有其他原因OVER子句將不被支持?

然後我發現類似老校版:

SELECT TOP X * FROM TABLE WHERE ID NOT IN (SELECT TOP Y ID FROM TABLE ORDER BY ID) ORDER BY ID其中X =每頁和Y =開始在其備案號。

但是,我的查詢比許多外連接複雜得多,有時通過除主表以外的內容進行排序。例如,如果有人選擇了多少視頻用戶已發佈命令,查詢可能需要像這樣:

SELECT TOP 50 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID WHERE iUserID NOT IN (SELECT TOP 100 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID ORDER BY iVideoCount) ORDER BY iVideoCount 

的問題是在子查詢選擇線路:TOP 100 iUserID,iVideoCount

要使用「NOT IN」子句,似乎我只能在子查詢中有1列(「SELECT TOP 100 iUserID FROM ...」)。但是當我在子查詢SELECT語句中沒有包含iVideoCount時,子查詢中的ORDER BY iVideoCount沒有正確排序,所以我的子查詢的排序方式與我的父查詢的排序方式不同,這使得整件事情變得毫無用處。還有大約5個鏈接外部聯接的表格可以在排序中起作用。

我不知所措!上述兩種方法是我能找到的讓SQL Server返回行的子集的兩種方法。我準備好返回整個結果並循環遍歷PHP中的每條記錄,但只顯示我想要的記錄。這是一種效率低下的方式,它是我最後的手段。

關於如何讓SQL Server在上述場景中模仿MySQL的LIMIT子句的任何想法?

+0

'ROW_NUMBER()OVER( )'在SQL Server 2005中受支持。必須有其他的東西給出錯誤。你能用'row_number'顯示一個不適合你的查詢嗎? –

+2

看這裏:http://stackoverflow.com/questions/5784072/no-support-for-over-in-ms-sql-server-2005 – Dalex

回答

0

不幸的是,儘管SQL Server 2005 Row_Number()可用於尋呼和與SQL Server 2012 data paging支持與訂購增強膠版和獲取下,如果你不能使用這些解決方案,您需要先

  1. 的創建一個臨時表與身份列。
  2. 然後順序插入數據到臨時表中BY子句
  3. 使用臨時表標識列值,就像ROW_NUMBER()值

我希望它能幫助,