sql >> データベース >  >> RDS >> Sqlserver

レコードが上下に移動したときの SQL Server の並べ替えシーケンス番号

    アイテムを移動する前に、古い位置を知る必要があります。また、アイテムが上に移動したか下に移動したかによって、ロジックが異なる必要があります。プロセスの大まかな概要 (テストされていません) は次のとおりです。

    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;
    

    DBFiddle 変数の使用 のデモ 、CTE の使用



    1. ユーザーが選択した複数のオプションをテーブルに保存する方法

    2. sys_refcursorの代替

    3. PHPでPDOを使用してストアドプロシージャを作成する

    4. MySQLパフォーマンスベンチマーク:MySQL5.7とMySQL8.0