SQL Server reorder sequence number when records are moved up or down

前端 未结 2 1153
礼貌的吻别
礼貌的吻别 2021-01-26 18:17

I have one table in SQL Server with Id, Plan_Id, sequence_no and the following data.

Id          Plan_Id      sequence_no
----------- ------------ -         


        
2条回答
  •  遥遥无期
    2021-01-26 19:10

    You need to know the old position before you can move items around. And your logic needs to be different depending on whether the item was moved up or down. Rough outline of the process (not tested) is as follows:

    DECLARE @Id INT = 1100000004; -- this id
    DECLARE @NewPosition INT = 1; -- needs to have this position
    
    WITH RowToMove AS (
        -- using cte instead of variables
        SELECT Plan_Id, sequence_no AS OldPosition
        FROM planRecords
        WHERE Id = @Id
    ), RowsToUpdate AS (
        -- columns used inside set and where clause of the update statement
        SELECT Id, sequence_no, OldPosition
        FROM planRecords
        CROSS JOIN RowToMove
        -- select rows that belong to same category and position between old and new
        WHERE planRecords.Plan_Id = RowToMove.Plan_Id AND sequence_no BETWEEN 
            CASE WHEN OldPosition < @NewPosition THEN OldPosition ELSE @NewPosition END AND
            CASE WHEN OldPosition > @NewPosition THEN OldPosition ELSE @NewPosition END
    )
    UPDATE RowsToUpdate SET sequence_no = CASE
        WHEN Id = @Id THEN @NewPosition -- this is the row we are moving
        WHEN OldPosition < @NewPosition THEN sequence_no - 1 -- row was moved down, move other rows up
        WHEN OldPosition > @NewPosition THEN sequence_no + 1 -- row was moved up, move other rows down
    END;
    

    Demo on DBFiddle using variables, using CTE

提交回复
热议问题