【问题标题】:Update an oracle table with data from another table in SAS使用 SAS 中另一个表中的数据更新 oracle 表
【发布时间】:2014-02-12 18:03:56
【问题描述】:

我正在尝试运行以下代码来从 click_summ 表中的数据更新表摘要。

data temp(index=(comp=(card_number package_sk)));
set click_summ(where=(^missing(e_1st_click_dt)));
keep card_number package_sk e_1st_click_dt;
run;

data summary(drop=new_date) ;
set summary;
set temp(rename=(e_1st_click_dt= new_date) in=a) key=comp;
if a then do;
   e_1st_click_dt = min(e_1st_click_dt,new_date);
end;
else
   _ERROR_ = 0; /*No need for IORC errors*/
run;

这段特定的代码抛出了一个错误:

错误:ORACLE 表 Summary 已为 OUTPUT 打开。此表已存在,或存在名称冲突 与现有对象。此表不会被替换。此引擎不支持 REPLACE 选项。

相同的解决方法是什么?这个问题与我之前提出的一个问题有关(Summerizing a table in SAS

【问题讨论】:

    标签: sql sas


    【解决方案1】:

    只需将表名从摘要更改为其他名称并尝试..我不确定我们是否可以使用摘要作为表名,因为 proc summary 存在...不确定但尝试看看

    【讨论】:

    • 实名并非摘要。但这不是原因。我的要求是更新同一张表,因此更改表名也不能解决我的问题:\
    【解决方案2】:

    正如错误消息所说,您不能在 DATA-step 中替换 oracle 表。它的解决方法是:

    1) 在临时 SAS 数据集中进行所有数据操作;

    2) 使用PROC SQL ... DELETE ...删除原始Oracle表中的所有行;

    3) 使用 PROC APPEND 将新数据(临时数据集)添加到空 Oracle 表中。

    【讨论】:

    • 这是我必须开始的解决方案。但是被删除的事实吓到了,如果追加失败怎么办?!
    • 嗯,这就是备份的目的。作为删除的替代方法,您可以在 PROC SQL 中尝试 UPDATE。
    • 是的,没错。但我假设您仍然需要在更新之前在临时数据集中进行合并。并且只有在使用准备好的数据更新 oracle 表之后。
    【解决方案3】:
    data temp;
    set click_summ(where=(^missing(e_1st_click_dt)));
    keep card_number package_sk e_1st_click_dt;
    run;
    
    data summary(drop=new_date) ;
    modify summary temp(rename=(e_1st_click_dt= new_date) in=a);
    by card_number, package_sk;
    if a then do;
       e_1st_click_dt = min(e_1st_click_dt,new_date);
    end;
    else
       _ERROR_ = 0; /*No need for IORC errors*/
    run;
    

    修改是关键。这也适用于 Oracle 表。而且速度也很快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2011-10-25
      • 2019-12-27
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多