2017-07-02 64 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