4

我编写了以下 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);

我得到以下输出:

消息 207,级别 16,状态 1,第 5 行
无效的列名称“行号”。
消息 207,级别 16,状态 1,第 5 行
无效的列名称“行号”。

如您所见,我想ROW_NUMBER只获取通常由查询返回的行的子集。我以前从未使用过该ROW_NUMBER功能。

我究竟做错了什么?

4

1 回答 1

14

您不能直接使用列的别名,将其包装在派生表或 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);
于 2012-05-31T20:49:59.420 回答