2012-05-31 93 views
4

我写了下面的SQL代码在我的SQL Server上运行。为什么在SQL Server中使用ROW_NUMBER时会出现错误?

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
Invalid column name 'rownumber'.
Msg 207, Level 16, State 1, Line 5
Invalid column name 'rownumber'.

正如你所看到的,我想用ROW_NUMBER只得到通常会由查询返回的行的子集。我从来没有使用过ROW_NUMBER函数。

我在做什么错?

回答

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); 
+0

运行在你的答案结果给出的第一个查询出现以下错误:'多部分标识符“atd.DeviceID”无法绑定。 ' –

+0

@Daniel只需将DeviceID列的atd前缀关闭即可。 –

+0

@DanielAllenLangdon - 你是对的,我现在更新了我的答案 – Lamak

相关问题