Sql Server 2017
是否可以在SQL中构造一个列,用作群集主键(值1,值2,值3)的标识列?
|--------+--------+--------+---------------|
| Value1 | Value2 | Value3 | Identity-ish? |
|--------+--------+--------+---------------|
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 2 |
|--------+--------+--------+---------------|
| 1 | 2 | 1 | 1 |
| 1 | 2 | 1 | 2 |
| 1 | 2 | 1 | 3 |
|--------+--------+--------+---------------|
| 2 | 5 | 3 | 1 |
| 2 | 5 | 3 | 2 |
|--------+--------+--------+---------------|
| 82 | 21 | 13 | 1 |
| 82 | 21 | 13 | 2 |
|--------+--------+--------+---------------|
当前,我解决此问题的方法是查询表中给定PK的max(Identity-ish?),并在插入新记录时对其进行递增。
但是,项目的规模已经达到了如此之大,以至于这种方法的调用过于频繁,有时又一次被调用两次(导致两个相同的行(Value1,Value2,Value3,Identity-ish? ))
理想情况下,我希望能够声明身份身份?作为“身份”列,该列的值将按照我上面显示的方式自动分配。
答案 0 :(得分:0)
我想你想要的是
select * from
(
select Value1,Value2,Value3,
row_number ()over (partition by Value1,Value2,Value3 order by
Value1,Value2,Value3) as Identity-ish?
from tablename
)rnk
答案 1 :(得分:0)
对列进行分区使用ROW_NUMBER()
功能
select t.*,
ROW_NUMBER()
OVER(partition by value1,value2,value3 ORDER BY value1,value2,value3 )
from t
value1 value2 value3 identity_is
1 1 1 1
1 1 1 2
1 2 1 1
1 2 1 2
1 2 1 3
在这里我举个例子