sql >> Databáze >  >> RDS >> Sqlserver

Při přesunutí záznamů nahoru nebo dolů změní pořadí pořadí SQL Serveru

Než budete moci položky přesouvat, musíte znát starou pozici. A vaše logika se musí lišit v závislosti na tom, zda byla položka přesunuta nahoru nebo dolů. Hrubý nástin procesu (netestováno) je následující:

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 na DBFiddle pomocí proměnných , používá CTE



  1. načíst data z databáze mysql na základě typů dovolené, jako je zkouška, neplacená, roční

  2. #1221 - Nesprávné použití UPDATE a ORDER BY

  3. Dotaz MySql pro získání všech kombinací dvou sloupců s NULL, pokud neexistuje žádný odpovídající záznam

  4. Migrují všichni do cloudu?