2017-02-10 91 views
1

我有一个表,如DB2更新序列号,但只增加当条件发生

A  B   C   D 
32  6100812 778899 123 
32  6100812 778593 123 
32  6100812 458962 123 
33  8000812 885522 P111118 
33  8000812 885537 P111118 
32  6100915 990011 AA456 
32  6100915 789684 AA456 
32  6100915 485217 AA456 

而且需要使用,我可以使用DB2函数来创建序列创建 连续数进行基于C柱的更新。问题是我需要保持号码 不增加,而列A和B不会改变它们的值。

到目前为止,我有:

create sequence renumber 
    start with 1 
    increment by 1 
    no maxvalue 
    no cycle; 

Update MYLIB.MYTABLE 
Set 
    C = 'SP' || lpad((nextval for renumber),5,'0') ; 

drop sequence renumber; 

所以,我得到:

A  B   C   D 
32  6100812 778899 SP00001 
32  6100812 778593 SP00002 
32  6100812 458962 SP00003 
33  8000812 885522 SP00004 
33  8000812 885537 SP00005 
32  6100915 990011 SP00006 
32  6100915 789684 SP00007 
32  6100915 485217 SP00008 

而我真正需要的是这样的:

A  B   C   D 
32  6100812 778899 SP00001 
32  6100812 778593 SP00001 
32  6100812 458962 SP00001 
33  8000812 885522 SP00002 
33  8000812 885537 SP00002 
32  6100915 990011 SP00003 
32  6100915 789684 SP00003 
32  6100915 485217 SP00003 

可以这样在做单一更新? 我在SQLRPGLE程序中使用它作为嵌入式SQL。

在此先感谢您的帮助

+0

您可以使用一个单独的表,它只有列A和B的不同值吗?把你的序列号放在该表中并加入。 – Andrew

+0

谢谢,这可能会证明是有用的,但它会增加程序的运行时间,因为我将为QTEMP库创建表,并且没有数据,然后用不同的(A,B)值填充它,更新序列并最终通过连接更新原始表。考虑到该计划将经常使用,我正试图找到更直接的方法来处理手头的任务。 –

+1

相关表格似乎最好。现在你将有列(A,B)=(32,6100812),下一个是(33,8000812)。但是有些未知的未来日期,该表可能会插入列(A,B)=(32,7777777)。然后顺序列D将永远中断,或者每个后续行将需要按照插入行的计数以某种方式递增。重新设计数据库以满足关系概念可以节省很多未来的麻烦并提高性能。 – user2338816

回答

2

合并成MYLIB.MYTABLE OT
使用(选择A,B, 'SP' || LPAD((ROW_NUMBER()OVER()),5, '0' )
ROWNUM
FROM MYLIB.MYTABLE组由A,b
顺序由A,b

)作为NT(A,b,ROWNUM)
上ot.a = nt.a和ot.b = nt.b
匹配时
更新集d = nt.rownum
否则忽略