2017-07-02 63 views
1

我有表列request_num,客戶ID,....有幾個客戶ID沒有更新的記錄。所以我想獲取相同請求數量的客戶ID並更新客戶ID爲空/空白的記錄。請讓我知道,如果下面將在Oracle工作Oracle - Self加入以更新列

UPDATE CUST_VW 
    SET A.CUST_ID=B.CUST_ID 
    WHERE A.REQUEST_NUM = B.REQUEST_NUM AND B.CUST_ID!= NULL; 


Sample Data 
request_num|Customer id 
12   | ANBZ 
12   | 
12   | 
13   | 
13   | xyz 

我想更新客戶ID爲要求NUM爲它是空從其他記錄有相同的請求num.Thanks

回答

3

使用子查詢:

UPDATE CUST_VW C 
    SET CUST_ID = (SELECT MAX(C2.CUST_ID) 
        FROM CUST_VW C2 
        WHERE C.REQUEST_NUM = C2.REQUEST_NUM AND 
          C2.CUST_ID IS NOT NULL 
       ) 
    WHERE CUST_ID IS NULL ; 

_VW強烈建議您有一個觀點,這可能是不可更新。你應該更新基礎表而不是視圖。

+0

感謝您的快速回復。請嘗試上述說法並恢復原狀。 – jayachsi

-2

您使用的是哪個版本的Oracle?始終包含這些信息 - 通常是相關的。在這種情況下:可用於解決此問題的選項取決於您的版本。

在Oracle 12.1及更高版本中,您可以「通過連接更新」爲聚合查詢。

update (select a.cust_id, b.cust_id as new_id 
     from a join (select request_num, max(cust_id) as new_id 
         from  a 
         group by request_num 
        ) b 
       on a.request_num = b.request_num 
     ) 
set cust_id = new_id 
where cust_id is null and new_id is not null 
; 

在早期版本中,你可以使用一個merge聲明:

merge into a 
    using (select request_num, max(cust_id) as new_id 
      from a 
      group by request_num 
     ) b 
    on (a.request_num = b.request_num) 
when matched then update a.cust_id = b.new_id 
    where a.cust_id is null and b.new_id is not null 
; 

在兩種方案中,a是當前表的名稱。 b是聚合子查詢的名稱 - 名稱b在解決方案中定義,但您需要用您的實際表名替換a

+0

我看到兩個downvotes爲這個答案。這將有助於本主題的讀者指出**這裏提供的解決方案有什麼不對。 – mathguy