即使删除一个数字,如何在序列号中创建列
Posted
技术标签:
【中文标题】即使删除一个数字,如何在序列号中创建列【英文标题】:How to make column in serialised number even if one number is deleted 【发布时间】:2020-04-25 09:40:10 【问题描述】:我有一张桌子
FieldName | FieldValue | FieldOrder
-------------------------------------
Srl | value1 | 0
Data | value2 | 0
Content | value3 | 0
Srl | val1 | 1
Data | val2 | 1
Content | val3 | 1
Srl | vall1 | 2
Data | vall2 | 2
Content | vall3 | 2
Srl | data1 | 3
Data | data2 | 3
Content | data3 | 3
如果我要删除一些行
Delete from CatogoryFieldValueMaster where FieldOrder = 1
//It will show result as
FieldName | FieldValue | FieldOrder
-------------------------------------
Srl | value1 | 0
Data | value2 | 0
Content | value3 | 0
Srl | vall1 | 2
Data | vall2 | 2
Content | vall3 | 2
Srl | data1 | 3
Data | data2 | 3
Content | data3 | 3
我需要更新表格以重新排序 FieldOrder 列以显示为 0,1,2,3...。 我需要做哪些修改才能让我的表成为
FieldName | FieldValue | FieldOrder
-------------------------------------
Srl | value1 | 0
Data | value2 | 0
Content | value3 | 0
Srl | vall1 | 1
Data | vall2 | 1
Content | vall3 | 1
Srl | data1 | 2
Data | data2 | 2
Content | data3 | 2
请帮帮我
【问题讨论】:
【参考方案1】:我需要更新表格以重新排序 FieldOrder 列以显示为 0,1,2,3....
如果您想更改这些值,请按照 GMB 的建议使用可更新的 CTE。但是,我会使用dense_rank()
而不是row_number()
来解决这个问题:
with toupdate as (
select cfvm.*,
dense_rank() over (order by FieldOrder) - 1 as new_FieldOrder
from CatogoryFieldValueMaster cfvm
)
update toupdate
set FieldOrder = new_FieldOrder
where FieldOrder <> new_FieldOrder;
对于您给出的示例 - 删除了整组现场订单 - 这和 GMB 的解决方案做同样的事情。如果删除一行,则它们会产生不同的结果。对我来说,这更明智,但你并没有明确你真正想要做什么。
【讨论】:
【参考方案2】:我不建议存储这些派生信息 - 因为,正如您所发现的,维护它很复杂(可能,您需要在每次数据更改后重新编号整个表)。
相反,您可以在视图中使用row_number()
即时计算它:
create view CatogoryFieldValueMasterView as
select
FieldName,
FieldValue,
row_number() over(partition by FieldName order by FieldValue) - 1 FieldOrder
from CatogoryFieldValueMaster
也就是说,如果您确实需要 update
语句,这里有一个使用可更新 cte 的选项:
with cte as (
select
FieldOrder,
row_number() over(partition by FieldName order by FieldValue) - 1 FieldOrderNew
from CatogoryFieldValueMaster
)
update cte set FieldOrder = FieldOrderNew
【讨论】:
以上是关于即使删除一个数字,如何在序列号中创建列的主要内容,如果未能解决你的问题,请参考以下文章
如何根据行创建日期在 PostgreSQL 中创建自定义序列?
如何使用python在streamlit和plotly中创建列?
如何使用 SQL Server Management Studio (2008) 在 SQL Server Compact Edition 中创建列