SQL(SMSS)中基于多列生成自定义ID的技术求助
基于多列组合生成连续ID的解决方案(SQL Server/SSMS)
嘿,我来帮你搞定这个ID生成的问题!从你的示例数据能看出来,这个ID是根据column1、column2、column3的唯一组合来分配连续编号的——相同的三列值对应同一个ID,不同组合的ID依次递增,对吧?
一、查询时动态生成ID(临时场景)
如果只是需要在查询结果里临时显示这个ID,不用修改原表,直接用DENSE_RANK()窗口函数就能完美实现需求:
SELECT DENSE_RANK() OVER (ORDER BY column1, column2, column3) AS ID, column1, column2, column3 FROM YourTableName;
为什么选DENSE_RANK()?
它会按照你指定的三列排序,给每一组完全相同的列组合分配连续的唯一编号,不会像RANK()那样出现排名空缺,正好匹配你示例里的规则——比如两个2017 | 101 | 1都会得到ID 2,下一个不同组合直接跳到3。
二、永久给表添加ID列
如果要把这个ID列永久加到表中,可以分两步操作:
- 先给表新增一个ID列:
ALTER TABLE YourTableName ADD ID INT;
- 用CTE(公用表表达式)给新增的ID列批量赋值:
WITH RankedData AS ( SELECT ID, DENSE_RANK() OVER (ORDER BY column1, column2, column3) AS NewID FROM YourTableName ) UPDATE RankedData SET ID = NewID;
后续维护提示
如果之后有新数据插入,想要保持这个ID规则的话,你可以:
- 在插入时提前计算对应的
DENSE_RANK()值再插入 - 或者创建一个触发器,在插入/更新操作时自动维护ID列的值
验证示例数据
把你的示例数据代入第一个查询,会得到和你给出的完全一致的结果:
ID | column1 | column2 | column3
1 | 2016 | 101 | 1
2 | 2017 | 101 | 1
2 | 2017 | 101 | 1
3 | 2017 | 303 | 1
内容的提问来源于stack exchange,提问作者Buglkrax
相关产品推荐
相关产品推荐

