2013-07-09 121 views
0

我有一個表,它有一個唯一的ID列,這是一個int。這並不一定包含所有最多的數字,有些會被遺漏(這不是一個身份列 - 不受我控制)。SQL ROW_NUMBER添加到變量

我需要從該表中選擇一些現有的行,並將它們添加到最後更改一列的數據,每行都有一個新ID,從MAX ID遞增。事情是這樣的:

declare @maxID int; 
set @maxID = (select MAX("ID") from "table"); 

insert into "table" 
select @maxID + ROW_NUMBER, 'newData', "col3", "col4" 
from "table" where "col2" = 'oldData'; 

不過,我不知道在哪裏把它從這裏 - 在ROW_NUMBER需要使用OVER聲明,老實說,我在這方面不明白。

任何幫助?

回答

0

你需要把它ROW_NUMBER的順序會產生數字。現有的ID在這裏是很好的選擇。

declare @maxID int; 
set @maxID = (select MAX("ID") from "table"); 

insert into "table" 
select @maxID + ROW_NUMBER OVER (ORDER BY "ID"), 'newData', "col3", "col4" 
from "table" where "col2" = 'oldData'; 
+0

太好了,謝謝。您能否詳細說明爲什麼需要OVER語句,而不是簡單地枚舉SELECT結果? – Dan

+0

那麼'ROW_NUMBER'語法需要'OVER'關鍵字。它不可能比這更簡單。 'ORDER BY'是必需的,因爲'ROW_NUMBER'不知道枚舉順序。 –

+1

數據庫中的行在邏輯上沒有「自然」順序(儘管我們人類傾向於將自然順序看作與聚集索引順序相同),因此ROW_NUMBER需要了解您想查看的順序記錄。 – Rikalous

0

在最簡單意義上的OVER子句只指定了列在

ROW_NUMBER() OVER(ORDER BY [primarykey]) 

命令行會給你一個「無間隙」代理主鍵