Пронумеровать записи. Пример для MSSQL 2005

Как пронумеровать записи в таблице в одном ее поле по порядку следования другого поля. Пример для MSSQL 2005.

Пример с использованием документированных функций, нумерация в заданном порядке.

UPDATE table1
  SET field1 = T2.rownum
  FROM table1 T1 INNER JOIN 
      (SELECT ROW_NUMBER() OVER (ORDER BY field2 ASC) AS rownum, field2 
         FROM table1
      ) T2 
      ON T1.field2 = T2.field2

Пример с "хаком", нумерация в физическом порядке следования строк.

DECLARE @n integer = 1;
UPDATE table1
SET field1 = @n, @n = @n + 1;

Порядок нумерации дубликатов не определен, как правило это будет физическое следование записей.

Тестовый пример:

CREATE TABLE table1 (
  field1 int,
  field2 nvarchar(255)
)
GO
INSERT INTO table1 (field2)
SELECT 'Value 1'
UNION
SELECT 'Value 2'
UNION
SELECT 'Value 3'
UNION ALL
SELECT 'Value 3'
GO
 
UPDATE table1
  SET field1 = T2.rownum
  FROM table1 T1 INNER JOIN 
      (SELECT ROW_NUMBER() OVER (ORDER BY field2 ASC) AS rownum, field2 
         FROM table1
      ) T2 
      ON T1.field2 = T2.field2
 
GO
SELECT * FROM table1
GO
DROP TABLE table1
GO

Результат:

field1      field2
----------- ------------
1           Value 1
2           Value 2
3           Value 3
4           Value 3

Комментарии

with cte

Imho, более читабельно

;with x as(SELECT ROW_NUMBER() OVER (ORDER BY field2 ASC) AS rownum, * FROM table1)
update x set field1 = rownum

а зачем тут джоины?

можно простот добавить
row_number() over ( order by s) as RowNumber

(где вместо s например id поле)

Изображение пользователя st.

Для нумерации

Для нумерации с записью значений в поле. Без записи достаточно одного SELECT, который и приведен в теле подзапроса UPDATE

Сократим код

CREATE TABLE table1 (
field1 int,
field2 nvarchar(255)
)
GO
INSERT INTO table1 (field2)
SELECT 'Value 1'
UNION
SELECT 'Value 2'
UNION
SELECT 'Value 3'
UNION ALL
SELECT 'Value 3'
GO

Declare @npp int
set @npp=1
Select 0000 as Fiel1, Field2 Into #t1 from table1
Update #t1 set @npp=Fiel1=@npp+1
Select * from #t1

Изображение пользователя st.

Вы всё перепутали

Вы всё перепутали. Нумеровать надо не временную таблицу, а постоянную. Нумеровать надо в заданном порядке.

Хак с переменной в запросе лучше использовать только в крайних случаях и на одной строке (типичный пример - таблица нумераторов, по одному на тип документов), а не на всей таблице, т.к. порядок обработки строк оптимизатором в общем случае не определен.