【发布时间】:2019-11-01 12:54:20
【问题描述】:
我有一个用于用户技能的 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),其他保持不变。
【问题讨论】:
-
其他一些示例会有所帮助,尤其是对于边缘情况。例如:如果 foo/swimming 的优先级更改为 0,那么 foo/running 是否应该为 1?如果 foo/swimming 改为 5 会怎样?
-
SQL Server 不按任何特定顺序存储或检索项目。查询是使用微处理器中的不同内核并行完成的,因此您必须始终使用 OrderBy 来对结果进行排序。
-
@jdweng,这个问题与存储或检索行的顺序没有任何关系。这是关于为用户的每一行分配新的优先级值,只要该用户的优先级值之一发生更改。
-
@HABO,第一个答案涉及删除行后的重新排序。这个问题是关于简单的重新排序(不删除行)。
-
@HABO,至于您链接的第二个答案,SQL 代码真的很长、很复杂,而且通常很讨厌。我什至不确定它是否正确。
标签: tsql sql-server-2017