Изменение порядка данных в таблице - PullRequest
2 голосов
/ 20 сентября 2009

Если у меня есть эти данные в таблице в MSSQL, которая представляет горизонтальную строку объектов и их координат:

row      id      value
35395   776130  0
35395   776131  20
35395   776132  40
35395   776133  60
35395   776134  80
35395   776135  100
35395   776136  120
35395   776137  140
35395   776138  160
35395   776139  180
35395   776140  200

И я хочу изменить значения так, чтобы они упорядочивались в порядке убывания (переверните строку на 180 градусов):

row      id      value
35395   776130  200
35395   776131  180
35395   776132  160
35395   776133  140
35395   776134  120
35395   776135  100
35395   776136  80
35395   776137  60
35395   776138  40
35395   776139  20
35395   776140  0

Как я могу сделать это, используя оператор обновления, не делая это один за другим?

Ответы [ 4 ]

2 голосов
/ 20 сентября 2009

Я не знаю природу проблемы, но только на вашем примере вы не можете обновить все строки, выполнив

UPDATE `thetable` SET value = 200 - value

Опять же, я не знаю природу проблемы, так что это может быть не так просто, но опять же, похоже, это работает в вашем упрощенном примере и может сработать в вашей реальной проблеме.

0 голосов
/ 20 сентября 2009

Вы хотите на самом деле обновить строки, или вы просто хотите отобразить их в обратном порядке? Если это просто порядок отображения, попробуйте это:

SELECT row, id, 200-value as Value
  FROM YourTable
 ORDER BY (200-value) DESC
0 голосов
/ 20 сентября 2009

Если вы используете SQL Server 2005 или более позднюю версию, это может сделать это для вас. Преимущество в том, что это один запрос.

with T1(rn,row,id,value) as (
  select
    rank() over (
      order by value,row,id
    ),
    row,id,value
  from T
), T2(rn,value) as (
  select
    row_number() over (
      order by value desc
    ), value
  from T
), T12(row,id,value,vnew) as (
  select row,id,T1.value,T2.value
  from T1 join T2 on T1.rn = T2.rn
)
  update T12 set
    value = vnew;

Я предположил, что столбец "value" изначально увеличивался, и вы хотите, чтобы он уменьшался, но я учел возможность совпадения двух последовательных значений, если (row, id) является ключом для таблицы.

Есть и другие возможности. Например, если (строка, id) является ключом, и вы хотите изменить порядок значений «значения» с любой позиции, в которой они находятся, на позицию «зеркала», вы можете сделать это:

with T1(rn,row,id,value) as (
  select
    rank() over (
      order by row,id
    ),
    row,id,value
  from T
), T2(rn,value) as (
  select
    rank() over (
      order by row desc,id desc
    ), value
  from T
), T12(row,id,value,vnew) as (
  select row,id,T1.value,T2.value
  from T1 join T2 on T1.rn = T2.rn
)
  update T12 set
    value = vnew;

При правильных индексах это может быть относительно эффективным.

0 голосов
/ 20 сентября 2009

С помощью Ответ Себа Я сформулировал решение:

declare @maxcoord int;
declare @rowid int; set @rowid = 35395

select @maxcoord = max(value) from table where row = @rowid

update table set value = @maxcoord - value 
where row = @rowid

Я думаю, что создам хранимую процедуру для этого, так как не думаю, что это будет единственный раз, когда она будет использоваться:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...