SQL根据其他表值创建标识列

时间:2018-07-31 15:42:01

标签: sql sql-server

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? ))

理想情况下,我希望能够声明身份身份?作为“身份”列,该列的值将按照我上面显示的方式自动分配。

2 个答案:

答案 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

在这里我举个例子

http://www.sqlfiddle.com/#!18/c4b62/4

相关问题