查询到合并/更新oracle查询中的增量列值

时间:2017-09-07 13:26:20

标签: sql oracle oracle11g oracle10g

我有一个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; 

1 个答案:

答案 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
;