为什么在SQL Server中使用ROW_NUMBER时出错?

时间:2012-05-31 20:47:55

标签: sql sql-server

我编写了以下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函数。

我做错了什么?

1 个答案:

答案 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);