我可能是錯的,但它似乎在這種情況下,你不必有一個聲明唯一的解決方案。我也沒有看到它的含義,因爲你只是在談論更新聲明,這並不意味着你不能有任何其他語句準備你的更新,是嗎?但如果你確實有這個想法,請原諒我,但我會繼續前進。 :)
首先,我想知道你的Column_Order
確實沒有差距。因爲如果沒有差距和值從1開始,那麼你就可以cyberkiwi的解決方案擺脫僅此例中(但所有信貸應該去找那個人):
declare @order int;
set @order = :order;
update P_Columns
set Column_Order =
case
when Column_Order = @order then Column_Order - 1
else Column_Order + 1
end
where Column_Order in (@order, @order - 1) and @order > 1
也就是說,你需要聲明@var,因此每個腳本只使用:order
。 (你可能已經知道了。)並且你在那裏。
但是,如果該解決方案無法按原樣應用,那麼基本上,我認爲,您只需添加更多語句即可預先計算由於交換而更新的其他訂單值。
下面是它可像:
declare @order int, @prev_order int;
set @order = :order;
/* here goes looking up for the other Column_Order */
select @prev_order = max(Column_Order)
from P_Columns
where Column_Order < @order;
/* and now update, which is basically the same,
only adapted for use with @prevorder,
and also we check if @prevorder has a value */
if @prevorder is not null
update P_Columns
set Column_Order =
case Column_Order
when @order then @prevorder
else @order
end
where Column_Order in (@order, @prevorder)
如果您有任何疑問,歡迎他們。
這是連接到哪個dbms? – RichardTheKiwi 2011-02-03 03:02:39