Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];

Вниз

Указать позицию для записи таблицы БД   Найти похожие ветки 

 
Chuck Bass   (2012-01-20 11:17) [0]

Есть таблица Documents(ID[AutoInc], Name[FixedChar], .., Order[Integer]).
Поле Order определяет позицию записи при отображении. Нужно написать функцию которая бы позволяла менять позицию записи. Как это лучше реализовать?


 
Anatoly Podgoretsky ©   (2012-01-20 13:15) [1]

> Chuck Bass  (20.01.2012 11:17:00)  [0]

А что значит менять позицию?


 
Ega23 ©   (2012-01-20 13:31) [2]

Есть запись A, есть запись B. Надо поменять их местами.
Update table set Order = A.Order where ID=B.ID;
Update table set Order = B.Order where ID=A.ID;
RefreshData;


 
Chuck Bass   (2012-01-20 13:33) [3]


> Ega23 ©


Спасибо


 
Самуилыч   (2012-01-20 16:53) [4]

Как быть, если на поле Order наложено требование уникальности?


 
Ega23 ©   (2012-01-20 18:05) [5]


> Как быть, если на поле Order наложено требование уникальности?


Зависит от СУБД. Например, завести сиквенс и при добавлении новой записи вставлять очередное значение.


 
Самуилыч   (2012-01-20 18:23) [6]


> Ega23 ©   (20.01.12 18:05) [5]

При insert все очевидно, а как поменять местами order в 2-х записях?

Решение "в лоб" тоже очевидно:

Запоминаем order в записях 1 и 2
В записи 1 ставим новый order
В записи 2 ставим запомненный order записи 1
В записи 1 ставим запомненный order записи 2

Но как-то это некрасиво. Неужели нет более элегантного способа?


 
Ega23 ©   (2012-01-20 21:10) [7]


> При insert все очевидно, а как поменять местами order в
> 2-х записях?


2 команды Update, это очевидно.


> Неужели нет более элегантного способа?


ИМХО, это наиболее элегантный.


 
sniknik ©   (2012-01-20 22:16) [8]

> наложено требование уникальности?
MSSQL
UPDATE table
SET Order=t2.Order
FROM table t1 INNER JOIN (SELECT Order FROM table WHERE Order IN (2, 3)) t2 ON (t1.Order<>t2.Order)
WHERE t1.Order IN (2, 3)


 
sniknik ©   (2012-01-21 00:08) [9]

или проще, на том же MSSQL  
UPDATE table
SET Order=CASE WHEN Order=2 THEN 3 ELSE 2 END
WHERE Order IN (2,3)


 
Самуилыч   (2012-01-21 13:07) [10]


> Ega23 ©   (20.01.12 21:10) [7]

Если order уникально, то первая update даст ошибку.

> sniknik ©   (21.01.12 00:08) [9]

Это если order заранее известен. А если нет?

Вот есть 2 записи:

ID ORDER
3  6
4  7  

ID - ключ. ORDER - уникально. Как поменять местами ORDER, если заранее его значения неизвестны?


 
sniknik ©   (2012-01-21 13:24) [11]

что то обязательно известно, либо ORDER либо ID, иначе, что менять? не известно одно, строй условие по другому, принцип не меняется.


 
sniknik ©   (2012-01-21 13:31) [12]

например, вариант 3
UPDATE table
SET Order=(SELECT Order FROM table t1 WHERE ID IN (2, 3) AND t1.ID<>table.ID)
WHERE ID IN (2, 3)


 
Самуилыч   (2012-01-21 14:39) [13]


> sniknik ©   (21.01.12 13:31) [12]

Спасибо. Это надо запомнить.


 
Ega23 ©   (2012-01-22 23:40) [14]

Блин. Ведь раньше делал эту фигню.
Действительно просто
update ttt
  set OrderFld = case Order Fld when N then M when M then N end
  where OrderFld in (N, M)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
15-1326981019
asail
2012-01-19 17:50
2012.05.27
Microsoft Team Foundation Server MSSCCI Provider


3-1276183014
REX
2010-06-10 19:16
2012.05.27
Вывод времени в QRDBText


2-1327425569
sem
2012-01-24 21:19
2012.05.27
Вызов процедуры


3-1276053430
O.O
2010-06-09 07:17
2012.05.27
Замена алгоритма в вычисляемое поле Firebird


15-1326832202
Юрий
2012-01-18 00:30
2012.05.27
С днем рождения ! 18 января 2012 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский