Управление порядком данных

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Управление порядком данных

Сообщение MIT » 20.10.2009 (Вт) 16:58

Существует таблица, содержащая три столбца: Identity, текст (какой-то, не важно) и позицию этого текста. Например таблица может выгдлядеть вот так:
Код: Выделить всё
Identity  Text  Position
0  A  1
1  B  2
2  C  3
3  D  4
4  E  5
5  F  6

Задача заключается в том, что бы передвинуть один из пераметров вверх или вниз по нашей мысленной шкале позиционарования, т.е. сделать примерно так:
Код: Выделить всё
0  A  1
1  B  2
2  C  4     <-
3  D  3     <-
4  E  5
5  F  6


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

И дополнительный не обязательный к решению вопрос: а как подвинуть через строку? А через две (и более), для получения такого результата:
Код: Выделить всё
0  A  1
1  B  2
2  C  4     <-
3  D  5     <-
4  E  3     <-
5  F  6
?

База у нас MSSQL 2008.

_______________
Поправил пост, добавил упоминание об Identity столбце
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Управление порядком данных

Сообщение alibek » 20.10.2009 (Вт) 22:03

Обозначения: r1, r2 - первая, вторая запись, p1, p2 - позиции первой и второй записи.
Обменять местами две записи: update r1 на 0, update r2 на p1, update r1 на p2

Другой вариант - имитировать удаление и вставку на новое место:
update ... set pos = 0 where pos = p1
update ... set pos = pos - 1 where pos > p1
update ... set pos = pos + 1 where pos > p2-1
update ... set pos = p2 where pos = 0
Lasciate ogni speranza, voi ch'entrate.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Управление порядком данных

Сообщение arvitaly » 20.10.2009 (Вт) 22:55

Да я тоже так думал, но ведь я так понимаю в Position могут быть совсем не последовательные значения а любые??

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Управление порядком данных

Сообщение MIT » 21.10.2009 (Ср) 10:47

alibek писал(а):Обозначения: r1, r2 - первая, вторая запись, p1, p2 - позиции первой и второй записи.
Обменять местами две записи: update r1 на 0, update r2 на p1, update r1 на p2
4 запроса (эти + select для получения значений (по идее мы имеем только идентификаторы строк, которые надо поменять местами))... Я думал о таком варианте, но он мне кажется довольно громоздким.
arvitaly писал(а):Да я тоже так думал, но ведь я так понимаю в Position могут быть совсем не последовательные значения а любые??
Значения позиции могут быть от 1 до [количества записей], а вот порядок может быть любым.


З.Ы. Что-то я прочитал свой вопрос и понял, что написан он довольно мутно... Если не понятно - скажите, попробую переформулировать.

______________
Хотя меняются местами же только последовательные значения, поэтому и вариант с +1 тоже годиться
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Управление порядком данных

Сообщение alibek » 21.10.2009 (Ср) 11:42

Вариант с 4 обновлениями — он универсальный и подойдет для перемещения записи в любое место.
Вариант с 3 обновлениями подойдет только если надо обменять местами две соседние записи.
Есть и другие варианты (один update с вложенным запросом или один select и один update), но практического смысла в них нет, они будут медленнее.
Lasciate ogni speranza, voi ch'entrate.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Управление порядком данных

Сообщение MIT » 21.10.2009 (Ср) 12:48

Спасибо, сделал 3мя обновлениями, работает :)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 221

    TopList