私は間違っているかもしれませんが、この場合は1つのステートメントのみの解決策を持つ必要はありません。 UPDATEのステートメントだけを話していたので、あなたはそれを意味するものではありません。しかし、もしあなたがそれを念頭に置いてくれたら、私を許してください。でも、私は進んでいくつもりです。 :)
まず、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