Обновить столбец из таблицы, начиная с 0 - PullRequest
0 голосов
/ 03 октября 2018

У меня есть таблица документов SQL Server с двумя полями, Idx1 и Idx2:

Idx1      Idx2
 0         23
 1         34
 2         12
 4          1
 5         21
 7         45
 8         50
 9          3 
10          9
...        ...

Обратите внимание, что числа в столбце Idx1 уникальны, они никогда не повторяются.

И теперь япытаюсь изменить нумерацию столбца Idx1, начиная с 0, то есть 0,1,2,3,4, ... и т. д.

Ожидаемый результат должен быть:

Idx1      Idx2
 0         23
 1         34
 2         12
 3          1
 4         21
 5         45
 6         50
 7          3 
 8          9
...        ...

Я попробовал ниже, и это работает:

DECLARE @myVar int
SET @myVar = 0

UPDATE
  Docs
SET
  @myvar = Idx1 = @myVar + 1

, но меня беспокоит, в каком порядке SQL Server их нумерует.Я хотел бы явно упорядочить их сначала по столбцу Idx1, а затем перенумеровать их с учетом этого порядка.

ПРИМЕЧАНИЕ : я использую SQL Server 2008

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

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

Использование оконной функции ROW_NUMBER, доступной в SQL Server 2008, для создания столбца с временной (для запуска запроса) последовательностьюна order by аргумент.Затем вычтите из него 1, чтобы начать с 0.

UPDATE docs
SET idx1 = t.rn
FROM (
  SELECT idx1, row_number() over (order by idx1) - 1 as rn
  FROM docs
) t
WHERE docs.idx1 = t.idx1
0 голосов
/ 03 октября 2018

Почему бы просто не использовать функцию row_number():

with t as (
     select *, (row_number() over (order by idx1))-1 seq
     from docs
)

update t 
     set t.idx1 = t.seq
from t inner join
     docs t1
     on t1.idx1 = t.idx1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...