我有一个ORACLE表 - AccountDetails - request_id必须是唯一的
Account_No Request_Id Issue_date Amount
1 567 20150607 $156
2 789 20170406 $765
3 20170216 $897
4 987 20160525 $345
5 564 20170112 $556
6 20171118 $987
需要使用以下逻辑更新request_id,其中request id为null。我需要获取最大请求ID并需要更新请求ID(最大请求ID + 1)WHERE request_id为null并且request_id在表中必须是唯一的。所以结果应该是。
Account No Request_Id Issue_date Amount
1 567 20150607 $156
2 789 20170406 $765
3 988 20170216 $897
4 987 20160525 $345
5 564 20170112 $556
6 989 20171118 $987
尝试使用以下查询但该值未获得增量。在request_id(988)中更新相同的值。
MERGE INTO account_details tgt
USING (SELECT account_no,
CASE WHEN request_id IS NULL THEN 1 + max(request_id)
ELSE request_id
END request_id,
issue_date,
amount,
ROWID r_id
FROM accountdetails) src
ON (tgt.rowid = src.r_id)
WHEN MATCHED THEN
UPDATE SET tgt.request_id = src.request_id;
答案 0 :(得分:1)
你需要以某种方式生成数字1,2,3 ......这是一种方式。 MERGE的“源”表只是为必须更新的行(请求id为NULL的行)获取ROWID,并在生成行时记录ROWNUM。然后UPDATE子句使用此ROWNUM。
merge into accountdetails
using ( select rowid as rid, rownum as rn from accountdetails where request_id is null ) x
on (accountdetails.rowid = x.rid)
when matched then update
set request_id = (select max(request_id) from accountdetails) + x.rn
;
似乎重复计算MAX(request_id)
,每个更新的行一次;但是优化器很聪明,可以识别出这个计算值是“常量”(它不会从一行到下一行),所以该值实际上只计算一次。
编辑:正如Boneist在下面的评论中指出的那样,此问题中不需要MERGE
语句。 UPDATE
语句效果更好,更简单。
update accountdetails
set request_id = (select max(request_id) from accountdetails) + rownum
where request_id is null
;