前提・実現したいこと
テーブルの構造は次のようになっております。
ID/KOJINNO/CD/RENBAN/INSERT_DATE
1/00001/0001/1/2020-06-15
2/00002/0121/1/2020-06-15
3/00002/0143/1/2020-06-18
4/00002/0777/1/2020-06-17
5/00003/0777/1/2020-06-18
主キー : ID
ユニークキー : KOJINNO,CD,RENBAN
上記テーブルの"CD"カラムのコードをこの度変更することとなりました。
変更は次のようになっております。
旧CD/新CD
0001/1111
0121/2222
0143/9999
0777/9999
コードの変換は
UPDATE HM_KIO SET KIOCD = '1111' where KIOCD = '0001';
UPDATE HM_KIO SET KIOCD = '2222' where KIOCD = '0121';
のように順に実施し、連番は、KOJINNO,CDに重複があった場合、重複レコードのMAX(RENBAN)+1をセットするという形としました。
上記のコードの変更に伴い、コード変換を行った後のテーブルが次になります。
ID/KOJINNO/CD/RENBAN/INSERT_DATE
1/00001/1111/1/2020-06-15
2/00002/2222/1/2020-06-15
3/00002/9999/1/2020-06-18
4/00002/9999/2/2020-06-17
5/00003/9999/1/2020-06-18
ここで、'KOJINNO'と'CD'が重複するデータが発生し、連番を適切に割り振る必要が生まれました。
INSERT_DATEを基準に日付順に連番を割り振るという処理を実施したいのですが、うまくいきません。
下記のSQLを実行したところ、日付で連番を取得することができました。
select kojinno, cd, insert_date, row_number() over(PARTITION BY kojinno, cd order by INSERT_DATE) from TABLE_TEST order by kojinno
しかし、更新を行うとなると、エラーが発生します。
update TABLE_TEST a SET a.renban = (select row_number() over(PARTITION BY kojinno, cd order by INSERT_DATE) from TABLE_TEST b where a.kojinno = b.kojinno and a.cd = b.cd and a.renban = b.renban)
解決のアプローチや、そもそもupdate処理の認識が間違っている気もします。
よろしければ、アドバイスや解決法を教えていただければ幸いです。
処理
発生している問題・エラーメッセージ
ORA-00001: 一意制約(XXXXXXXXXXXX)に反しています
該当のソースコード
SQL
1update TABLE_TEST a SET a.renban = (select row_number() over(PARTITION BY kojinno, cd order by INSERT_DATE) from TABLE_TEST b where a.kojinno = b.kojinno and a.cd = b.cd and a.renban = b.renban)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/15 06:23
2020/06/15 06:29
2020/06/15 07:13
2020/06/15 08:19