使用ROW_NUMBER的SQL Server存储过程
我尝试创建一个存储过程,该存储过程需要从哪里开始,要显示的最大行数和位置。它们返回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
我重新写你的代码,所以它使用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或更高版本)
我重新写你的代码,以便它使用一个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)
嘿,我从你的幽默因素的答案堆放。请不要采取错误的方式:在Sql Server 2012之前,我认为这是正确的答案。 – 2014-09-12 20:45:29
@JoelCoehoorn一点都不:-)。对于op的版本,你的回答更好,我认为 – Lamak 2014-09-12 20:48:24
另外:编辑这个,而不是我自己的错误(现在回滚)。这就是我得到的复制/粘贴:/ – 2014-09-12 20:48:52
在您的子查询中添加一个连接,并在外部查询中添加该列。 – 2014-09-12 20:29:59
或更好的是,加入子查询的结果 - 没有保证,但可能会更好地强制SQL Server在加入之前进行过滤。 – 2014-09-12 20:30:36
什么版本的Sql Server?有一种新的OFFSET/FETCH技术对于这种分页更好。 – 2014-09-12 20:42:20