2017-09-03 50 views
0

我有如下表 - AccountDetails更新/合併使用子查詢表在Oracle

Account_No Request_Id Issue_date Amount Details 
    1    567  20150607  $156  Loan 
    2    789  20170406  $765  Personal 
    3      20170216  $897  
    3    987  20160525  $345  Loan 
    3    456  20170112  $556  Loan 
    4    234  20171118  $987  Loan 

我有哪裏請求ID爲空或詳細信息爲空的賬戶下面的邏輯來更新REQUEST_ID。 需要基於發佈日期獲取帳戶的最新請求ID,並且必須更新請求ID(最新請求ID + 1)WHERE request_id爲空或者詳細信息爲空。所以結果應該是

Account No Request_Id Issue_date Amount Details 
    1    567  20150607  $156  Loan 
    2    789  20170406  $765  Personal 
    3    457  20170216  $897  
    3    987  20160525  $345  Loan 
    3    456  20170112  $556  Loan 
    4    234  20171118  $987  Loan 

我試着用下面的查詢

MERGE INTO AccountDetails a 
USING (select Request_Id + 1,ROW_NUMBER() OVER (PARTITION BY B.Account_No 
ORDER BY B.Issue_date desc) AS RANK_NO 
      from AccountDetails) b 
ON (a.Account_No = b.Account_No AND a.DETAILS IS NULL) 
WHEN MATCHED THEN 
UPDATE SET a.Request_Id = b.Request_Id 
WHERE B.RANK_NO = 1; 

回答

1

聽起來像是你需要使用解析LAG函數來確定前一行的REQUEST_ID,如:

MERGE INTO account_details tgt 
    USING (SELECT account_no, 
       CASE WHEN request_id IS NULL THEN 1 + LAG(request_id) OVER (PARTITION BY account_no ORDER BY issue_date) 
        ELSE request_id 
       END request_id, 
       issue_date, 
       amount, 
       DETAILS, 
       ROWID r_id 
     FROM accountdetails) src 
    ON (tgt.rowid = src.r_id) 
WHEN MATCHED THEN 
    UPDATE SET tgt.request_id = src.request_id; 

當然,這個設計看起來有點奇怪 - 爲什麼request_id null在第一位呢?這是一個獨特的專欄嗎?如果是這樣,如果最終用替換ID複製現有的request_id,會發生什麼情況?另外,如果它是賬號中第一行有request_id爲空的話會發生什麼?

0
update accountdetails set request_id=(select max(request_id)+1 from accountdetails) 
    where request_id is null and details is null;