T-SQL - 重新排列表中的值列表

时间:2016-06-20 23:44:33

标签: sql tsql sql-server-2012

代码:

CREATE TABLE #Temp (T_ID INT IDENTITY(1,1), T_Desc NVARCHAR(10), PriorityOrder INT)

INSERT INTO #Temp
SELECT 'Apple',1
UNION
SELECT 'LG',2
UNION
SELECT 'Microsoft',3
UNION
SELECT 'Samsung',4
UNION
SELECT 'Sony',5

SELECT * FROM #Temp

DROP TABLE #Temp

输出:

T_ID    T_Desc      PriorityOrder
1       Apple       1
2       LG          2
3       Microsoft   3
4       Samsung     4
5       Sony        5

目标: 如果T_Desc值(即参数#1)向上/向下移动一行或多行,则重新排列PriortyOrder。 即如果LG从PriortyOrder 2转移到5(即参数#2),则新输出看起来像,

T_ID    T_Desc      PriorityOrder
1       Apple       1
2       LG          5
3       Microsoft   2
4       Samsung     3
5       Sony        4

换句话说,LG以下的所有内容都因“Priortyorder”字段向上移动。此外,如果索尼从PriorityOrder 5转移到1(在订单中向上移动),这应该可以。

T_ID    T_Desc      PriorityOrder
1       Apple       2
2       LG          3
3       Microsoft   4
4       Samsung     5
5       Sony        1

我已经看到移动/移位/重新排序的示例顺序向上/向下一行,但是无法确定多行的移位。

更新:列表的数据量可能会有所不同。

1 个答案:

答案 0 :(得分:1)

Declare @srcID, @srcPri int, @dstPri int, @minPri int, @maxPri int, @delta

-- set @srcID and @dstPri as appropriate

Begin Transaction

Select @srcPri=PriorityOrder from #temp with (HOLDLOCK) where T_ID=@srcID

If @srcPri<@dstPri begin
  Select @minPri=@srcPri+1,
         @maxPri=@dstPri,
         @delta=-1
End else begin
  Select @minPri=@dstPri,
         @maxPri=@srcPri-1,
         @delta=1
End

Update #temp
Set PriorityOrder=PriorityOrder+@delta
Where PriorityOrder between @minPri and @maxPri

Update #temp
Set PriorityOrder=@dstPri
Where T_ID=@srcID

Commit Transaction

您需要在@srcID中提供要移动/移位的行的T_ID,并在@dstPri中提供目标PriorityOrder。如果同时运行上述代码的多个实例,如果两个实例都需要更新相同的记录,则可能会出现死锁