如何使用连接更新DB2表?

时间:2013-11-16 19:46:19

标签: sql db2 sql-update

我有两张桌子,我希望通过加入它们来更新。我正在使用DB2 V9.7。

ORDER_APPROVALS

ORDER_ID    CREATED_BY_ID   CREATED_BY_NAME PROCESS_DT           
-------------------------------------------------------
234         2               admin           (null)    
307         2               admin           (null)    
313         2               admin           11-11-2013    

ORDER_ATTRIBUTE

ORDER_ID    ATTRIBUTE_ID    VALUE
-----------------------------------
234         123             ? --(ORDER_APPROVALS.CREATED_BY_NAME)
307         123             ? --(ORDER_APPROVALS.CREATED_BY_NAME)

我想针对Attribute_ID 123更新值字段。到目前为止,我尝试了以下查询。但这不起作用。我在Netezza尝试过类似的加入方式。想知道,如何在DB2中做到这一点?

update ORDER_ATTRIBUTE OT set OT.VALUE = 
(select CREATED_BY_NAME from ORDER_APPROVALS OA 
where OA.ORDER_ID = OT.ORDER_ID and OA.PROCESS_DT is NULL) 
where OT.ATTRIBUTE_ID = 123 and OT.ORDER_ID in 
(select ORDER_ID from ORDER_APPROVALS where PROCESS_DT is NULL)

3 个答案:

答案 0 :(得分:6)

您正在寻找MERGE声明:

merge into ORDER_ATTRIBUTE ot
    using (select ORDER_ID, CREATED_BY_NAME
             from ORDER_APPROVALS
            where PROCESS_DT is null) oa
    on
       (ot.ORDER_ID = oa.ORDER_ID)
    when matched 
     and ot.ATTRIBUTE_ID = 123
    then update set VALUE = oa.CREATED_BY_NAME;

答案 1 :(得分:0)

我认为您需要使用派生表来实现此目的:

update order_attributes
set value = (
  select
  created_by_name
  from(    
    select
    created_by_name,
    oa.order_id
    from
    order_approvals oa
    left outer join order_attributes ot
    on oa.order_id = ot.order_id
    AND OT.ATTRIBUTE_ID = 123 
    and OT.ORDER_ID in 
      (select ORDER_ID from ORDER_APPROVALS where PROCESS_DT is NULL)
    ) ORDERS
 WHERE orders.order_id = order_attributes.order_Id
    )

答案 2 :(得分:0)

update ORDER_ATTRIBUTE OT set OT.VALUE = 
(select CREATED_BY_NAME from ORDER_APPROVALS OA 
where OA.ORDER_ID = OT.ORDER_ID and OA.PROCESS_DT is NULL) 
where OT.ATTRIBUTE_ID = 123 

这足够了。