2008-11-14 4 views
2

У меня есть таблица с полем sort_id. В этом поле есть числа от 1 до n, которые определяют порядок наборов данных. Теперь я хочу удалить некоторые элементы, а затем я хочу изменить порядок таблицы. Поэтому мне нужен запрос, который «находит» пробелы и изменяет поле sort_id в соответствии с изменениями.Обновление ключей сортировки после удаления

Конечно, я мог бы сделать что-то вроде этого:

SELECT sort_id FROM table WHERE id = 5 

Затем сохраните sort_id, а потом:

DELETE FROM table WHERE id = 5 
UPDATE table SET sort_id = sort_id - 1 WHERE sort_id > {id from above} 

Но я хотел бы сделать процесс переупорядочения в одном шаге.

ответ

0

для SQL Server 2005: это, как вы получите новую последовательность:

SELECT row_number() over(order by sort_id) as RN 
FROM table 

обновление таблицы означает, что вы должны присоединиться, что выбрать для обновления вашего:

update t1 
set sort_id = t2.RN 
FROM table t1 
    join (SELECT row_number() over(order by sort_id) as RN FROM table) t2 
     on t1.UniqueId = t2.UniqueId 
+0

Извините, я не упомянул, что мне нужен стандартный SQL или, по крайней мере, определенный MySQL запрос. Любые идеи? – okoman

+0

В MySQL вы не можете делать UPDATE и SELECT одной и той же таблицы в том же запросе. –

0

Я не знать варианты синтаксиса MySQL и не может тестировать запрос в реальном времени, но что-то вроде следующего должно дать вам хотя бы идею:

update table t1 
set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id) 
+0

В MySQL вы не можете делать UPDATE и SELECT той же таблицы в том же запросе. –

3

У Mladen и Arvo есть хорошие идеи, но, к сожалению, в MySQL вы не можете SELECT и UPDATE ту же таблицу в том же самом отчете (даже в подзапросе). Это известное ограничение MySQL.

Вот решение, которое использует пользовательские переменные MySQL:

SET @i := 0; 
UPDATE mytable 
SET sort_id = (@i := @i + 1) 
ORDER BY sort_id; 

Для чего это стоит, я бы не стал так делать, так или иначе. Если ваш sort_id используется только для сортировки, а не как «номер строки», то строки все еще находятся в отсортированном порядке после удаления строки, где id=6. Значения необязательно должны быть последовательными для сортировки.

+0

Они не должны быть последовательными для сортировки, правда, но, оставляя отверстие, можно сделать код, который, как ожидается, сможет поменять местами, или приращение/декремент ведут себя неожиданно. Как вы говорите, может или не имеет значения. +1 для решения, специфичного для MySQL. –

+0

Блестящий и эффективный, спасибо Билл! Небольшое дополнение состоит в том, что если вы используете ** PDO **, вы должны предварительно запустить запрос для установки переменной: '$ pdo-> query (" SET @i = 0 ");' –

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