在 SQL 服务器 table 中动态重新排序列值
Dynamically reorder column values in a SQL Server table
我有一个 SQL 服务器 table 用于用户技能,每个用户的优先顺序如下:
+----+------+----------+----------+
| 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",我将技能"swimming"的优先级从(1)更改为(2);更新语句还必须以动态方式更改该用户所有其他技能的优先级。
所以在那个例子中 "swimming" 将是优先级 (2) 而不是 (1),运行 将是 (1) 而不是 (2),其他的将保持不变。
在这个答案中,我假设您想在 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
我有一个 SQL 服务器 table 用于用户技能,每个用户的优先顺序如下:
+----+------+----------+----------+
| 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",我将技能"swimming"的优先级从(1)更改为(2);更新语句还必须以动态方式更改该用户所有其他技能的优先级。
所以在那个例子中 "swimming" 将是优先级 (2) 而不是 (1),运行 将是 (1) 而不是 (2),其他的将保持不变。
在这个答案中,我假设您想在 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