2013-04-06 4 views
1

Я хочу перебрать строки таблицы .. реорганизовать мою «Параметры формы», установив OrderID в @NUMCOUNT ...SQL: Изменение порядка Список Заказать

Я хочу, чтобы иметь возможность изменить порядок моего списка , Причина, по которой мне нужно сделать это, - это то, что если я удалю вариант формы, то он будет не в порядке .. то есть (1, 2, 3, 5) .. Я хочу (1, 2, 3, 4) .. и т.д ..

Пример таблицы:

ID КодЗаказа FormOption

1 1 Название

2 3 Адрес 2

3 2 Адрес 1

DECLARE @NUMCOUNT int 
SET @NUMCOUNT = 0 
WHILE (SELECT Count(OrderID) FROM FormOptions WHERE ProductID=1) > @NUMCOUNT 
BEGIN 
    SET @NUMCOUNT = @NUMCOUNT + 1 
    PRINT 'The count is ' + CAST(@NUMCOUNT as char) 
    UPDATE FormOptions SET OrderID = @NUMCOUNT WHERE ID=???? 
END 
+3

Не понимаю, что 1,2,3,5 все еще заказано. вы хотите повторно назначить все ваши значения orderID смежными? – OldProgrammer

+0

Под «SQL» вы подразумеваете «Transact-SQL»? – ruakh

+0

Да! T-SQL ... дело в том, что .. когда я добавляю элемент .. он подсчитывает ... так что у меня 4 .. то он добавляет к этому списку, а есть 2 5 ..поэтому я хотел бы переупорядочить список. – mrjamiebowman

ответ

0

Я бы предложил оставить OrderId самостоятельно, поскольку @OldProgrammer сказал, что они все равно будут в порядке, плюс (если я не пропущу что-то), это, казалось бы, добавило бы лишних накладных расходов.

Если вы действительно хотите иметь непрерывные номера, предположительно, для целей представления, то либо толчок, что на уровне представления, или создать представление, которое будет делать что-то вроде

SELECT 
    ROW_NUMBER() AS OrderNumber 
    , OtherColumn 
FROM FormOptions 
ORDER BY OrderID 
+0

Вещь .. Мне нужно иметь возможность переупорядочить этот список. – mrjamiebowman

+0

ID OrderID FormOption 1 1 Название 2 3 Адрес 2 3 2 Адрес 1 – mrjamiebowman

+0

Заменить список, откуда, когда и как. Например, если я установил элемент на 8 в 4, они переключаются или все «перемещаются вниз»? Только один элемент перемещен сразу? Когда вы добавляете элемент, а затем используете 'COUNT + 1', почему бы не использовать' MAX + 1'? –

0

Я бы советовал не используя счет для заказа. Раньше у меня было несколько столбцов для заказа на основе того, что решил пользователь.

Один из способов быстро исправить проблему - дать orderID> Max (orderID). Таким образом, вы гарантируете, что каждый новый элемент получит orderID>, чем самое высокое значение, независимо от количества элементов в списке.

Вы можете иметь столбец только для сортировки и разрешить пользователям устанавливать порядок вещей.

Иногда бывает проще (и лучше), чтобы думать о том, как вы можете изменить то, что вы делаете, а не код, чтобы делать то, что ваше мышление :)

1

Я предполагаю, что вы работаете над чем-то, что нужно чтобы удалить из упорядоченного списка и вставить в упорядоченный список в определенной позиции. Удаление не требует сделать заказ плотным, но это может быть сделано:

delete from FormOptions 
    where OrderId = @SelectedFormOption 
update FormOptions 
    set OrderId = OrderId - 1 
    where OrderId > @SelectedFormOption 

Вы можете обернуть, что в сделке. (Убедитесь, что вы понимаете, сделки, как это весьма важно.)

Установка аналогична:

update FormOptions 
    set OrderId = OrderId + 1 
    where OrderId >= @TargetOrderId 
insert into FormOptions 
    (OrderId, ...) values (@TargetOrderId, ...) 

Перестановка позиции заказа может быть сделано атомарно в одном обновлении:

update FormOptions 
    set OrderId = case when OrderId = @TargetA then @TargetB else @TargetB end 
    where OrderId in (@TargetA, @TargetB) 

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

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