在SQL

时间:2017-09-21 15:12:00

标签: sql sql-server sequence

我希望就实现将数字插入行并自动增加序列的最佳方法提供一些建议。我正在使用SQL Server 2014我知道有序列对象。我玩过临时表,什么不是,但我只是在思考这个问题。以下是我正在使用的数据:

Table1: OrderList
Column: LineNumber

Table2: WatchList
Column: LineNumber

OrderList表中的LineNumber由另一个系统自动生成,结果数量为10k。所以,10000,20000,30000。

订单列表中的数据会更新到关注列表表中。然后添加新行,但LineNumber不是。所以在WatchList表中它看起来像:

Item / LineNumber / xzy
134   10000   blah blah
1432  20000   blah blah blah
433   NULL    blah blah
839   NULL    blah blah

我想要做的是运行更新以将30000和40000填充到那些空字段中,老实说,我不确定最好的方法。

如果您对最适合的路径有一些建议或指示,我会很感激。

1 个答案:

答案 0 :(得分:3)

您可以通过CTE和Row_Number()进行更新。

@YourTable只是一个示范表变量。

此外,over (Order by Item)是任意选择。您可以拥有over (Order by (Select NULL))或其他序列。

示例

Declare @YourTable Table (OrderNumber varchar(50),[Item] varchar(50),[LineNumber] int,[xzy] varchar(50))
Insert Into @YourTable Values 
 (2525,134,10000,'blah blah')
,(2525,1432,20000,'blah blah blah')
,(2525,433,NULL,'blah blah')
,(2525,839,NULL,'blah blah')
,(5050,500,70000,'blah blah')
,(5050,600,80000,'blah blah blah')
,(5050,700,NULL,'blah blah')


;with cte as (
    Select *
          ,RN =10000 * Row_Number() over (Partition By OrderNumber Order by Item) + (Select max(LineNumber) from @YourTable Where OrderNumber=A.OrderNumber)
     From  @YourTable A
     Where LineNumber is null
)
Update cte Set LineNumber = RN

Select * from @YourTable

更新后的来源

OrderNumber Item    LineNumber  xzy
2525        134     10000       blah blah
2525        1432    20000       blah blah blah
2525        433     30000       blah blah
2525        839     40000       blah blah
5050        500     70000       blah blah       --<< Notice New OrderNumber
5050        600     80000       blah blah blah
5050        700     90000       blah blah