Есть ли хороший способ создать структуру, похожую на очередь, в SQL Server?
Требования:
- Когда я вставляю строки, я хочу, чтобы они были по умолчанию в нижней частиочередь
- Когда я выбираю строки, я хочу легко получить верхнюю часть очереди
- Вот сложный вопрос: я хочу легко перемещать что-то вверх по очереди, ипереориентировать все остальное.Пример: переместите элемент 5 на номер 1, затем 1-4 станет 2-5
Простой столбец идентификации будет работать для требований 1 и 2, но как мне обработать 3?
Решение
В итоге я реализовал решение от @ roger-wolf Одно отличие: я использовал триггер, а не хранимую процедуру для перенумерации.Вот мой код триггера:
CREATE TRIGGER [dbo].[TR_Queue]
ON [dbo].[Queue]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- Get the current max value in priority
DECLARE @maxPriority INT = COALESCE((SELECT MAX([priority]) FROM [dbo].[Queue]), 0);
WITH newValues AS (
-- Renumber by priority, starting at 1
SELECT [queueID]
,ROW_NUMBER() OVER(ORDER BY [priority] ASC) AS [priority]
FROM (
-- Pretend all nulls are greater than previous max priority
SELECT [queueID]
,COALESCE([priority], @maxPriority+1) AS [priority]
FROM [dbo].[Queue]
) AS tbl
)
UPDATE q
SET q.[priority] = newValues.[priority]
FROM [dbo].[Queue] AS qroger-wolf
INNER JOIN newValues
ON q.[queueID] = newValues.[queueID]
END
Это хорошо работает для меня, поскольку очередь всегда относительно мала и редко обновляется, поэтому мне не нужно работать с производительностью триггера.