我编写了以下SQL代码以在我的SQL Server上运行。
SELECT
atd.DeviceID,
ROW_NUMBER() over(order by atd.deviceid) as rownumber
FROM
dbo.Devices atd
WHERE
(rownumber between 11 and 20);
我得到以下输出:
Msg 207,Level 16,State 1,Line 5
列名称'rownumber'无效。
Msg 207,Level 16,State 1,Line 5
列名称'rownumber'无效。
如您所见,我想使用ROW_NUMBER
来获取通常由查询返回的行的子集。我之前从未使用过ROW_NUMBER
函数。
我做错了什么?
答案 0 :(得分:13)
您不能直接使用列的别名,将其包装在派生表或CTE上:
SELECT *
FROM ( SELECT DeviceID,
ROW_NUMBER() over(order by deviceid) as rownumber
FROM dbo.Devices) atd
WHERE (rownumber between 11 and 20);
或者
;WITH CTE AS
(
SELECT DeviceID,
ROW_NUMBER() over(order by deviceid) as rownumber
FROM dbo.Devices
)
SELECT *
FROM CTE
WHERE (rownumber between 11 and 20);