2014-09-12 133 views
2

我嘗試創建一個存儲過程,該存儲過程需要從哪裏開始,要顯示的最大行數和位置。它們返回HouseID的列表和位置,但我也希望它包含另一個名爲dbo.House的表中的「房屋名稱」,該表中有HouseId將其鏈接到位置。我將如何去添加第二個表。使用ROW_NUMBER的SQL Server存儲過程

感謝,

CREATE PROCEDURE dbo.basicHouseSearch 
    @StartIndex int, 
    @MaxRows int, 
    @HouseLocation NVarChar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Select 
     Location.HouseID, CityTown 
    FROM 
     (SELECT 
      ROW_NUMBER() OVER (ORDER by Location.HouseID) as RowNumber, 
      Location.HouseID, 
      CityTown 
     FROM dbo.Location) Location 
    WHERE 
     RowNumber >= @StartIndex 
     AND ROWNUMBER < (@StartIndex + @MaxRows) 
END 
GO 
+0

在您的子查詢中添加一個連接,並在外部查詢中添加該列。 – 2014-09-12 20:29:59

+1

或更好的是,加入子查詢的結果 - 沒有保證,但可能會更好地強制SQL Server在加入之前進行過濾。 – 2014-09-12 20:30:36

+0

什麼版本的Sql Server?有一種新的OFFSET/FETCH技術對於這種分頁更好。 – 2014-09-12 20:42:20

回答

3

我重新寫你的代碼,所以它使用OFFSET/FETCH(我認爲這是更清晰的那樣):

SELECT L.HouseID, 
     L.CityTown, 
     H.Name [Name of the house] 
FROM dbo.Location L 
LEFT JOIN dbo.House H 
    ON L.HouseID = H.HouseID 
ORDER BY L.HouseID 
OFFSET @StartIndex ROWS FETCH NEXT @MaxRows ONLY 

(需要SQL Server 2012或更高版本)

+0

+1,Nice!,我應該問及SQL Server版本。 – Lamak 2014-09-12 20:46:57

+0

@JoelCoehoorn謝謝,但它給了我一個關於OFFSET和ONLY的錯誤,說'錯誤'附近的語法不正確,'ONLY'附近的語法不正確,期望從 – Tiber 2014-09-12 20:56:02

+0

@ user3043862因此,數據庫所屬的服務器實際上是SQL Server 2012 ?,數據庫的兼容級別是什麼? – Lamak 2014-09-12 20:59:34

3

我重新寫你的代碼,以便它使用一個CTE(我認爲這是更清晰的那樣):

;WITH CTE AS 
(
    SELECT RowNumber = ROW_NUMBER() OVER (ORDER by L.HouseID), 
      L.HouseID, 
      L.CityTown, 
      H.Name [Name of the house] 
    FROM dbo.Location L 
    LEFT JOIN dbo.House H 
     ON L.HouseID = H.HouseID 
) 
SELECT * 
FROM CTE 
WHERE RowNumber >= @StartIndex 
AND RowNumber < (@StartIndex + @MaxRows) 
+0

嘿,我從你的幽默因素的答案堆放。請不要採取錯誤的方式:在Sql Server 2012之前,我認爲這是正確的答案。 – 2014-09-12 20:45:29

+0

@JoelCoehoorn一點都不:-)。對於op的版本,你的回答更好,我認爲 – Lamak 2014-09-12 20:48:24

+0

另外:編輯這個,而不是我自己的錯誤(現在回滾)。這就是我得到的複製/粘貼:/ – 2014-09-12 20:48:52