2014-09-23 3 views
1

я есть таблицаобновление столбца порядок в таблице, но поддерживать порядок

id | title | F_ID | order 
---------------------------- 
1 | test 1| 1  | 44 
2 | test 3| 1  | 3 
3 | test 4| 1  | 1 
4 | test 5| 2  | 1 

я хочу, чтобы обновить столбец порядка до +10 для всех строк, которые имеют F_ID 1, но сохранить Орден

результат должно быть

id | title | F_ID | order 
---------------------------- 
1 | test 1| 1  | 30 
2 | test 3| 1  | 20 
3 | test 4| 1  | 10 
4 | test 5| 2  | 1 

я могу вставить все строки, которые я хочу обновить до временной таблицы , а затем петли строки и обновить каждую строку в реальной таблице, [ID].

Возможно, есть лучший вариант?

+0

Такого рода вещи, вероятно, работать http://stackoverflow.com/questions/8401552/sql-increment-a-number Трюк s eems быть SET x = X + 10 – Terry

+0

нет, мне нужно дать все новое число, не увеличивайте его – eyalb

+0

Ваш пример не имеет смысла. Если вы добавили +10 к заказу, F_ID = 1. В вашем примере первая колонка уменьшилась на 14, вторая поднялась на 17, а третья поднялась на 9. – Arun

ответ

4

Я думаю, что это должно работать:

SQL Fiddle

сервера Настройка MS SQL 2008 схемы:

create table test (id int, title varchar(49), F_ID int, [order] int) 
insert test values 
(1 , 'test 1', 1, 44), 
(2 , 'test 3', 1, 3), 
(3 , 'test 4', 1, 1), 
(4 , 'test 5', 2, 1) 

Запрос 1:

update test 
set [order] = new_order 
from test t 
inner join (
    select 
     id, 
     new_order = ROW_NUMBER() over (partition by f_id order by [order]) * 10 
    from test t 
    where f_id = 1 
) t2 
on t.id = t2.id 

Results:

Запрос 2:

select * from test 

Results:

| ID | TITLE | F_ID | ORDER | 
|----|--------|------|-------| 
| 1 | test 1 | 1 | 30 | 
| 2 | test 3 | 1 | 20 | 
| 3 | test 4 | 1 | 10 | 
| 4 | test 5 | 2 |  1 | 
+0

работает отлично! – eyalb

0

Возможно, это может быть лучшее решение, но вы можете попробовать это, используя рекурсивный CTE.

;WITH updCTE 
AS 
(
    SELECT 30 AS YourOrder, 1 AS id 

    UNION ALL 

    SELECT YourOrder - 10 AS YourOrder, id + 1 AS id 
    FROM updCTE 
    WHERE YourOrder > 1 
) 
UPDATE YourTable 
SET [order] = YourOrder 
FROM updCTE 
JOIN YourTable ON updCTE.id = YourTable.id 
WHERE YourTable.F_ID = 1 
ORDER BY YourTable.id 
+0

мой идентификатор не начинается с 1 и увеличивается на 1, это может быть любое число – eyalb