Oracle - Self Join更新列

时间:2017-07-02 16:13:27

标签: sql oracle

我有表request_num,Customer id,....有几条记录的客户ID没有更新。所以我想获得相同请求数的Customer ID,并更新Customer id为null / blank的记录。如果以下内容适用于oracle,请告知我们

\

我想更新请求号的客户ID,该客户ID是来自具有相同请求数的其他记录的空值。谢谢

2 个答案:

答案 0 :(得分: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强烈建议你有一个可能无法更新的视图。您应该真正更新基础表而不是视图。

答案 1 :(得分:-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替换为您的实际表名。