Динамически переупорядочивать значения столбцов в таблице SQL Server - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть таблица SQL Server для навыков пользователя с порядком приоритетов для каждого пользователя, как это:

+----+------+----------+----------+
| ID | user | skill    | priority |
+----+------+----------+----------+
| 1  | foo  | swimming | 1        |
+----+------+----------+----------+
| 2  | foo  | running  | 2        |
+----+------+----------+----------+
| 3  | foo  | hunting  | 3        |
+----+------+----------+----------+
| 4  | boo  | swimming | 1        |
+----+------+----------+----------+
| 5  | moo  | swimming | 1        |
+----+------+----------+----------+
| 6  | moo  | running  | 2        |
+----+------+----------+----------+

Как мне написать код SQL, чтобы переупорядочить значения столбца приоритета (целое число) для всехнавыки для пользователя при изменении значения приоритета для одного из навыков?

Например: для пользователя "foo" я изменю приоритет навыка "плавание" с (1) на (2);оператор обновления также должен динамически изменять приоритет всех других навыков для этого пользователя.

Так что в этом примере «плавание» будет приоритетом (2) вместо (1), бег будет (1) вместо (2) остальные останутся прежними.

1 Ответ

3 голосов
/ 01 ноября 2019

В этом ответе я предполагаю, что вы хотите сделать это в SQL, а не в C #. Исходя из этого предположения, эти два оператора SQL внутри одной транзакции увеличивают приоритет указанного навыка на 1.

'Set @User to the required user and @Skill to the required skill.

'Decrease the priority of the user's skill above the specified skill.
UPDATE MyTable
SET    priority = priority + 1
WHERE  user = @User 
AND    priority = (SELECT priority - 1 
                   FROM MyTable 
                   WHERE user = @User
                   AND skill = @Skill)

'Increase the specified skill's priority.
UPDATE MyTable
SET    priority = priority - 1
WHERE  user = @User
AND    skill = @Skill
AND    priority > 1

Аналогичным образом эти два оператора SQL увеличьте указанный навык до указанного приоритета.

'Set @User to the required user and @Skill to the required skill.
'Set @NewPriority to the new priority.

'Decrease the higher-prioritised skills.
UPDATE MyTable
SET    priority = priority + 1
WHERE  user = @User 
AND    priority >= @NewPriority 
AND    priority < (SELECT priority
                   FROM MyTable 
                   WHERE user = @User
                   AND skill = @Skill)

'Set the specified skill's priority as requested.
UPDATE MyTable
SET    priority = @NewPriority 
WHERE  user = @User
AND    skill = @Skill
AND    priority > 1

И эти три оператора SQL перемещают указанный навык к указанному приоритету.

'Set @User to the required user and @Skill to the required skill.
'Set @NewPriority to the new priority.

'Decrease the higher-prioritised skills to
'handle case where new priority is higher.
UPDATE MyTable
SET    priority = priority + 1
WHERE  user = @User 
AND    priority >= @NewPriority 
AND    priority < (SELECT priority
                   FROM MyTable 
                   WHERE user = @User
                   AND skill = @Skill)

'Increase the lower-prioritised skills to
'handle case where new priority is lower.
UPDATE MyTable
SET    priority = priority - 1
WHERE  user = @User 
AND    priority <= @NewPriority 
AND    priority > (SELECT priority
                   FROM MyTable 
                   WHERE user = @User
                   AND skill = @Skill)    

'Set the specified skill's priority as requested.
UPDATE MyTable
SET    priority = @NewPriority 
WHERE  user = @User
AND    skill = @Skill
...