2016-09-01 3 views
0

Предположим, что у меня есть структуру таблицы вроде этого:Приращение столбец строк при обновлении записи ранее

ID (PK), Parent_ID (FK), Title, Position 

И строки, как это:

1, 1, Apple, 1 
2, 1, Orange, 2 
3, 1, Banana, 3 
4, 1, Lime, 4 
5, 1, Grapefruit, 5 
6, 2, Lemon, 1 

Теперь, скажем, я хочу, чтобы запустить следующий запрос:

UPDATE table SET Position = 1 WHERE ID = 3 

Как обновить поле позиции для других строк так, чтобы число приращений pr до места, где запись первоначально находилась в списке позиций. Обратите внимание, что это должно влиять только на строки с тем же Parent_ID).

Итак, когда закончите. это будет выглядеть так:

1, 1, Apple, 2 
2, 1, Orange, 3 
3, 1, Banana, 1 
4, 1, Lime, 4 
5, 1, Grapefruit, 5 
6, 2, Lemon, 1 

Спасибо!

+0

Прослушайте свой ожидаемый результат. Кажется, что первый вывод - это ожидаемый результат для меня. – 1000111

+0

Вы бы только установили значение Position в 1 и помнили другие строки или хотите установить любое значение позиции? – Tony

+0

@ 1000111 - результат выглядит корректно для меня. Строка 3 теперь имеет Positon 1, а остальные строки были изменены, чтобы оставаться в порядке. – Tony

ответ

0

обновления записей, где позиция находится между 1 и 3 (включительно), но идентификатор не равен с идентификатором только что обновленной записи (3), а также обеспечить parent_id:

UPDATE table SET Position = Position + 1 
WHERE ID <> 3 and Position>=1 and Position<3 and Parent_ID=1 
+0

Отлично! Именно то, что я искал. Большое спасибо! – John1984

1

Вам нужно запустить несколько обновлений других строк.

общее решение:

/** initial update or insert **/ 
UPDATE table SET Position = 1 WHERE ID = 3; 

/** update of the other sequence **/ 
UPDATE table Set Position = CASE WHEN Position >= 1 THEN Position + 1 ELSE Position - 1 End where id <> 3 
+0

Не дает для меня правильный результат. – John1984

Смежные вопросы