2013-07-09 3 views
0

У меня есть таблица с уникальным столбцом идентификатора, который является int. Это не обязательно содержит все числа до максимума, некоторые из них пропущены (это не столбец идентичности - из моего контроля).SQL ROW_NUMBER добавление к переменной

Мне нужно ВЫБРАТЬ некоторые существующие строки из этой таблицы и добавить их в конец, изменяя данные одного столбца, причем каждая строка имеет новый идентификатор, увеличиваясь с 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 требует заявление, над которым я честно не понимаю в этом контексте.

Любая помощь?

ответ

0

Вам нужно навести порядок которого ROW_NUMBER будет генерировать числа. Существующий идентификатор - хороший вариант здесь.

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]) 

даст вам «разрыв свободной» суррогатный первичный ключ