2017-01-19 3 views
2

のOracle DB 12.1にtab1というテーブルがあるとします。このテーブルにはrecord_id(NUMBER型)という列があります。 exchg_id。単一のUPDATE文(Oracle)に実行IDを追加する方法

このレコードIDは、新しい行のバッチがテーブルに挿入されると常に空です。私がする必要があるのは、条件...WHERE EXCHG_ID = 'something'を満たし、そのような行の数がNであるすべての行に対してrecord_idに値1..Nを設定することです。もちろん、これを手続き的に(for-loop内で)行う方法はわかっていますが私は1つのUPDATEステートメントを使用するより速い方法があるかどうかを知りたいと思います。私はこのような何かを想像します:

UPDATE tab1 SET record_id = {1..N} WHERE exchg_id = 'something'; 

あなたの助けをたくさん!

更新:更新の順番は重要ではありません。具体的な注文は必要ありません。任意の与えられたexchg_idに対して一意のrecord_idの1..Nが必要です。

+0

を使用し、10を言います。 3.4。任意のexchg_idの(行の)任意の順序で? – GurV

+0

はい、私は行の順序は気にしません。元のテキストでそれを指摘して申し訳ありません – Johnnyjanko

+0

この "record_id"を新しい行に追加したいと仮定した場合、既にテーブルにあった行と区別できますか?あるいは、条件がすでにそれをしているのでしょうか、おそらく "added_date>(何か)"のような条件ですか? – mathguy

答えて

3

あなたがNに1をRECORD_IDを設定するrownumを使用することができます。

UPDATE tab1 SET record_id = rownum WHERE exchg_id = 'something'; 

あなたには、いくつかのオフセットしている場合は、あなただけのシーケンシャル値1.2での行を更新したいrownum + 10

+0

おそらく 'と' record_id is null'を 'where'節に追加する必要があります。 – mathguy

+0

@mathguy - おそらく。 OPが必要とするものによって異なります。 – GurV

+0

いいえ、実際は私は間違っていました - 私は、OPが "新しいレコードのバッチが挿入されると、このrecord_idは常に空です"という部分を見逃しました。その部分はOKです。私はOPに別の質問をしました。「新しい」行と「古い」行を区別することについて、「古い」行のいくつかは彼/彼女が念頭に置いている状態を満たすかもしれないと仮定しています。 「過去に」いくつかの行で条件が満たされていない可能性があるため、「古い」行は 'record_id'でもnullになっている可能性があります。 – mathguy

関連する問題