Sql 删除行后重置列的数字序列

Sql 删除行后重置列的数字序列,sql,sql-server,Sql,Sql Server,我见过许多在删除一行后重新为标识列设置种子的解决方案。但是,我需要从不是标识列的列中重置数字序列 +------+---------+----------+ | group| user | sequence | +------+---------+----------+ | 1 | barney | 1 | | 1 | andy | 2 | | 1 | odis | 3 | | 1 | opie |

我见过许多在删除一行后重新为标识列设置种子的解决方案。但是,我需要从不是标识列的列中重置数字序列

+------+---------+----------+
| group| user    | sequence |
+------+---------+----------+
|   1  | barney  |     1    |
|   1  | andy    |     2    |
|   1  | odis    |     3    |
|   1  | opie    |     4    |
|   2  | beaver  |     1    |
|   2  | wally   |     2    |
|   2  | eddie   |     3    |
+------+---------+----------+
因此,如果我删除ODI,新序列需要如下所示:

+------+---------+----------+
| group| user    | sequence |
+------+---------+----------+
|   1  | barney  |     1    |
|   1  | andy    |     2    |
|   1  | opie    |     3    |
|   2  | beaver  |     1    |
|   2  | wally   |     2    |
|   2  | eddie   |     3    |
+------+---------+----------+
当删除发生时,您可以在表的顶部构建一个视图,动态计算序列,而不是重置列值(可能是其中重要的一部分)

在用户名上使用排序(但是这意味着在更新usernmae时序列可能会更改):

或者更好,使用基于原始序列的排序:

CREATE VIEW myview AS
SELECT
    group,
    user,
    ROW_NUMBER() OVER(PARTITION BY group ORDER BY sequence) sequence
FROM mytable t

我希望这能解决您的问题:

with tbl2(grp, usr, seq) as
(
select grp, usr,
    row_number() over(partition by grp order by seq) as seq
from tbl1
)
update tbl1
set seq = t2.seq
from tbl1 t1
join tbl2 t2 on t2.grp = t1.grp and t2.usr = t1.usr
where t2.seq != t1.seq

如果它不是一个标识列,那么您当前是如何生成序列的?因此,如果您在插入
opie
后删除
odis
,您想为该表重新生成整个序列吗?@DaleBurrell,是的,但我只想为组1重新生成序列。没有函数来执行此操作,因此您必须对其进行编码,也许最好的方法是创建一个触发器来处理删除,这将允许您知道删除了哪条记录并手动重新生成序列。在这种情况下,为什么要麻烦存储序列,而您只需在任何查询中通过按组划分的行数()生成序列。您确定按[用户]排序吗?@Sami:如果我们遵循创建视图的逻辑,我不确定保留原始顺序有多重要。当然,按顺序排序可能会更好。我相应地更新了我的答案。
with tbl2(grp, usr, seq) as
(
select grp, usr,
    row_number() over(partition by grp order by seq) as seq
from tbl1
)
update tbl1
set seq = t2.seq
from tbl1 t1
join tbl2 t2 on t2.grp = t1.grp and t2.usr = t1.usr
where t2.seq != t1.seq