2017-07-02 17 views
1

列にrequest_num、Customer id ...の列があるテーブルがあります。顧客IDが更新されていないレコードはほとんどありません。だから、私は同じ要求numの顧客IDを取得し、顧客IDが空白のレコードを更新したいと思います。下記の神託で動作する場合は私に知らせてくださいOracle - 自己結合を使用して列を更新する

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 

私はそれが同じ要求num.Thanksで他のレコードからヌルだそのための要求numの顧客IDを更新したい

答えて

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以降では、「結合を介して更新」を集約クエリに使用できます。両方のソリューションで

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はあなたの現在のテーブルの名前です:

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ステートメントを使用することができます。 bは集約サブクエリの名前です。解決法ではbという名前が定義されていますが、aを実際のテーブル名に置き換える必要があります。

+0

私はこの答えのために2つのdownvotesを参照してください。このスレッドの読者は、**ここで提供されているソリューションで間違っている**を指摘するのに役立ちます。 – mathguy

関連する問題