sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server omarranger sekvensnummer, når poster flyttes op eller ned

Du skal kende den gamle position, før du kan flytte rundt på genstande. Og din logik skal være anderledes afhængigt af, om varen blev flyttet op eller ned. Groft skitsering af processen (ikke testet) er som følger:

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 på DBFiddle brug af variabler , ved hjælp af CTE



  1. Hvordan forbinder jeg C++ MySQL Connector Libraries til Cmake?

  2. Fatal fejl:Læs venligst sikkerhedsafsnittet i manualen for at finde ud af, hvordan du kører mysqld som root

  3. Alternativ til mysql_real_escape_string uden at oprette forbindelse til DB

  4. FEJL! MySQL-manager eller server-PID-fil kunne ikke findes! QNAP