Обновить несколько записей, используя индексный результат подзапроса - PullRequest
0 голосов
/ 29 марта 2020

Допустим, у меня есть таблица с данными ...

| person_id  |  priority  |
|------------|------------|
|    678     |     2      |
|    413     |     4      |
|    912     |     1      |
|    111     |     5      |

Как мне обновить priority, чтобы значения были смежными? Т.е. ...

| person_id  |  priority  |
|------------|------------|
|    678     |     2      |
|    413     |     3      |    -- updated from 4 to 3
|    912     |     1      |
|    111     |     4      |    -- updated from 5 to 4

Я знаю, что могу использовать что-то вроде ...

select
    row_number() over (order by [priority]) as position
from
    table_name

..., чтобы найти «положение» человека, но как я могу использовать это для обновления той же строки?

Значения priority всегда должны начинаться с 1.

1 Ответ

2 голосов
/ 29 марта 2020

Вы можете использовать обновляемый CTE или подзапрос:

with toupdate as (
      select t.*, row_number() over (order by [priority]) as new_priority
      from table_name
     )
update toudpate
    set priority = new_priority
    where priority <> new_priority;
...