2014-09-12 157 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