用SQL重复键

时间:2017-01-12 15:25:34

标签: sql-server ms-access

我们在Access(或SQL)中有一个表,它有一个非unqiue的系统密钥

同一个表中有一列需要具有自动递增值,但仅适用于同一ID的每个记录。对于下一个ID,自动增量需要再次从1开始。

e.g

System Key                        IncrementingField
1                                                              1
1                                                              2
1                                                              3
1                                                              4
2                                                              1
2                                                              2
2                                                              3
3                                                              1
3                                                              2
3                                                              3
4                                                              1
5                                                              1
5                                                              2

我被要求写一个函数或声明或其他东西来做这个,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:0)

对于SQL Server,您可以将ROW_NUMBER()与适当的分区一起使用:

row_number() over (partition by [System Key] order by [System Key]) AS [IncrementingField]

这是一个示例脚本:

declare @tbl table ([System Key] int)
insert @tbl values (1), (1), (1), (1), (1)
    , (2), (2), (2)
    , (3), (3), (3)
    , (4)
    , (5), (5)

select *
, row_number() over (partition by [System Key] order by [System Key]) as IncrementingField
from @tbl

答案 1 :(得分:0)

如果插入SQL Server表,则可以使用窗口函数创建递增值:

select SystemKey
      ,row_number() over (partition by SystemKey) as IncrementingField
      ,row_number() over (partition by SystemKey order by SomeCol) as OrderedIncrementingField
from Table

如果您需要使用该ID的先前递增值“取种”此值,则可以使用派生表将其加入SystemKey上的目标表:

with MaxInc as
(
    select SystemKey
          ,max(IncrementingField) as MaxIncrementingField
    from Destination
)
select s.SystemKey
      ,row_number() over (partition by s.SystemKey)
        + isnull(d.MaxIncrementingField,0) as IncrementingField
from Source s
    left join MaxInc d
        on(s.SystemKey = d.SystemKey)

如果这为您提供了所需的结果集,则可以使用它来进行插入。