2012-05-31 136 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

相關問題