У меня есть две таблицы, которые я спроектировал таким образом, с учетом возможной перестановки элементов:
1. [dbo.test_db_002] with columns:
[id] = INT NOT NULL IDENTITY(1,1) PRIMARY KEY
[name] = NVARCHAR(255)
и
2. [dbo.test_db_003] with columns:
[ord] = INT
[itmid] = INT NOT NULL PRIMARY KEY
В столбце [itmid] есть ограничение, связывающее его с [dbo.test_db_002]. [Id] примерно так:
ALTER TABLE [dbo.test_db_003]
ADD CONSTRAINT fk1 FOREIGN KEY ([itmid])
REFERENCES [dbo.test_db_002]([id])
ON DELETE CASCADE ON UPDATE CASCADE;
Скажем, таблица [dbo.test_db_002] содержит следующие данные:
[id] [name]
3 John
5 Mary
8 Michael
10 Steve
13 Jack
20 Pete
и [dbo.test_db_003] имеют следующие данные для заказа:
[ord] [itmid]
1 5
4 8
5 13
8 3
10 10
13 20
Поэтому, когда я получаю имена из базы данных, я использую следующий SQL:
SELECT [name]
FROM [dbo.test_db_002] t1
LEFT JOIN [dbo.test_db_003] t2 ON t1.[id]=t2.[itmid]
ORDER BY t2.[ord] ASC
Создает список имен (упорядоченный по столбцу [dbo.test_db_003]. [Ord]):
Mary
Michael
Jack
John
Steve
Pete
То, что я ищу, - это возможность перемещать каждое из имен вверх и вниз по списку. Например, если я хочу переместить «Джона» на одну позицию вверх, что мне делать?
До сих пор я придумал этот частичный SQL:
WITH cte AS
(
SELECT [id], [ord], ROW_NUMBER() OVER (ORDER BY t2.[ord] ASC) AS rowNum
FROM [dbo.test_db_002] t1
LEFT JOIN [dbo.test_db_003] t2 ON t1.[id] = t2.[itmid]
)
Это выберет следующее:
rowNum [id] [ord]
1 1 5
2 4 8
3 5 13
4 8 3
5 10 10
6 13 20
Итак, я понимаю, что мне нужно сдвинуть значения в столбце [ord] на единицу, начиная с индекса 3 (поскольку индекс "John" равен 4), а затем каким-то образом установить для [ord] для "John" значение 5, но как ты это делаешь?