2017-02-10 27 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)シーケンスを更新し、最後にjoinを使用して元のテーブルを更新します。私はプログラムが頻繁に使用されることを考慮して、手元にあるタスクへのより直接的なアプローチを見つけようとしています。 –

+1

関連する表が最適と思われます。今度は列(A、B)=(32,6100812)、次は(33,8000812)です。しかし未知の未来の日付では、テーブルに列(A、B)=(32,77777777)が挿入されている可能性があります。順次列Dは永久に破棄されるか、または後続のすべての行は、挿入された行のカウントごとに何らかの形で増分する必要があります。リレーショナル・コンセプトに合致するようにデータベースを再設計することで、将来のトラブルを回避し、パフォーマンスを向上させることができます。 – user2338816

答えて

2

を事前に

おかげで、SELECT(使用、B 'SP' || LPAD((ROW_NUMBER()OVER())、5、 '0' MYLIB.MYTABLE OT
にマージ)ot.a = nt.aにNT(A、B、ROWNUM)
として、
順序B、

B)によるによってMYLIB.MYTABLE群から
ROWNUM
とot.b = nt.b
と一致すると
update set d = nt.rownum
else ignore