Oracle - 如何使用merge根据其他表和列中的值更新列

时间:2012-07-09 15:36:21

标签: sql oracle

我想根据与其他列和其他表的值比较更新closed_date列中的值。我用Oracle合并到声明中。但它给了我一个错误:

错误:ORA-00969:缺少ON关键字

我不确定出了什么问题。我想念什么吗?以下是我的剧本:

MERGE INTO PR_DMN dmn
USING (select alg.PR_DMN_ID, alg.PR_ACTIVITY_ID, alg.ACTIVITY_TS from PR_ACTIVITY_LOG) alg
ON dmn.PR_DMN_ID = alg.PR_DMN_ID
-- update
WHEN MATCHED THEN
UPDATE SET dmn.CLOSED_DATE =
    (CASE 
        WHEN alg.PR_ACTIVITY_ID IN ('10009', '10010', '10011', '10013') THEN alg.ACTIVITY_TS
        WHEN alg.PR_ACTIVITY_ID = '10005' AND dmn.CONT_RESP_TS <= dmn.CONT_RESP_DUE_TS THEN dmn.CONT_RESP_TS 
        WHEN alg.PR_ACTIVITY_ID = '10008' AND dmn.CORR_RESP_TS <= dmn.CORR_RESP_DUE_TS THEN dmn.CORR_RESP_TS
        ELSE dmn.CLOSED_DATE 
    END)

1 个答案:

答案 0 :(得分:6)

您有两个错误,正如您可以通过一个简单示例看到的那样。首先,on子句需要包含在括号中。其次,您不能在该子查询中的using子句中引用子选择的别名。

如果我使用您的表名设置一个简单示例,如下所示:

create table pr_dmn as
 select level as a, sysdate as b
   from dual
connect by level <= 10;

Table created.


create table PR_ACTIVITY_LOG as
 select level as a, sysdate as b
   from dual
connect by level <= 20;

Table created.

然后执行它应该工作的正确查询:

merge into pr_dmn dmn
 using (select a, b from pr_activity_log) alg -- no alg. inside the sub-query
    on (dmn.a = alg.a) -- wrapped in parenthesis
  when matched then
update set dmn.b = alg.b
       ;

10 rows merged.

我总是觉得PSOUG是这方面的一个很好的参考,尽管documentation也有一些很好的例子。