Проблема ручной сортировки при удалении - PullRequest
0 голосов
/ 14 октября 2019

У меня есть этот SQL

;WITH Sorted AS (
    SELECT  authorid,
            ROW_NUMBER() OVER (ORDER BY sorted) AS RowNumber
    FROM    author
    WHERE   authorid <> @id
)

UPDATE  p
SET     p.sorted = 
        (CASE 
            WHEN p.authorid =  @id THEN @id
            WHEN s.RowNumber >= @id THEN s.RowNumber + 1
            ELSE s.RowNumber
        END)
FROM    author p
        LEFT JOIN Sorted s ON p.authorid = s.authorid

Но этот код проблематичен, потому что я добавляю 1 значение, он работает, если последовательность в порядке, как 1,2,3,4,5.

Но если удалить запись, она испортит все

Поэтому, чтобы преодолеть эту проблему, я подумал, могу ли я использовать столбец primarykey для того же значения в отсортированном столбце и даже еслиудалить, сортировка должна работать без каких-либо проблем, и приведенный выше код будет сортировать записи должным образом.

Поскольку в какой-то момент только 1 элемент будет отсортирован при перемещении вверх или вниз.

Это больше похоже на обмен строк,

Есть идеи, как мне заставить это работать?

Вот пример данных

1 Ответ

0 голосов
/ 14 октября 2019

Я не могу понять, почему вы хотите включить в таблицу отдельную непрерывную числовую последовательность. Поддержание этой последовательности, вероятно, будет намного медленнее, чем вычисление последовательности сортировки на лету, каждый раз, когда вы выбираете из таблицы author.

В любом случае, если у вас есть веская причина, вот код:

;WITH Sorted AS (
    SELECT  authorid,
            ROW_NUMBER() OVER ( ORDER BY authorid ) AS RowNumber
    FROM    author
    -- If you want to exclude a specific author from sorting
    -- This will also not update sorted value for this author
    -- WHERE authorid <> @id
)
UPDATE a
SET sorted = RowNumber
FROM Sorted AS a

Комментарии:

Если вы делаете это для нумерации страниц, то вот типичный способ сделать это.

RE: "Потому что водна точка, только 1 элемент будет отсортирован при перемещении вверх или вниз. "- таблица базы данных не является связанным списком, куда вы перемещаете (повторно связываете) элементы в нужном вам порядке. Порядок данных таблицы базы данных на диске определяется доступностью свободного пространства и размером данных (аналогично тому, как файловое пространство распределяется в ОС), и он не будет иметь порядок столбца sorted, если у него нет кластеризованного индекса. Если у вас есть кластеризованный индекс, то SQL-сервер «попытается сохранить» порядок, но опять-таки он не будет переупорядочивать уже существующие данные на диске, если вы явно не укажете его (ALTER INDEX ... ON ... REBUILD).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...