Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server sắp xếp lại số thứ tự khi bản ghi được di chuyển lên hoặc xuống

Bạn cần biết vị trí cũ trước khi có thể di chuyển các vật dụng xung quanh. Và logic của bạn cần phải khác nhau tùy thuộc vào việc mục đó được di chuyển lên hay xuống. Sơ lược về quy trình (không thử nghiệm) như sau:

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 trên DBFiddle sử dụng các biến , sử dụng CTE



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 Tìm kiếm toàn văn trên bảng với khóa chính tổng hợp

  2. Cơ sở dữ liệu sao lưu SQL Server Express | Cách lập lịch trình tự động hóa và dọn dẹp sao lưu SQL Express

  3. classNotFoundException trong việc tải trình điều khiển JDBC

  4. Sao chép các hàng dựa trên giá trị cột trong mỗi hàng

  5. Truy vấn Sql để chia một cột thành hai cột