使用join更新多个列的有效方法

时间:2013-11-14 09:58:33

标签: sas

我真的很挣钱。

表需要更新有~15M行和~200列。

我需要使用工作表表更新几列。

这是(部分)我需要做的事情:

%macro condition;

%if &row_count>0 %then %do;

    data _null_;     
    set W4TWGKJ6 end=final;     
    if _n_ = 1 then call execute("proc sql  ;");     
    call execute
    ("update dds.insurance_policy set X_STORNO_BY_VERSION="||TOSNUM||" where     policy_no='"||cats(polid)||"' and X_INSURANCE_PRODUCT_CD='"||cats(prodid)||"' 
       and X_INSURER_SERIAL_NO = "||X_INSURER_SERIAL_NO||" and x_source_system_cd     ="||'"5"'||" and x_source_system_category_cd ="||'"5"'||" and x_current_ind     = "||'"Y"'||";,    

     update dds.insurance_policy set STATUS_CHANGE_DT="||ISSUE_DT||" where     policy_no='"||cats(polid)||"' and X_INSURANCE_PRODUCT_CD='"||cats(prodid)||"' 
       and X_INSURER_SERIAL_NO = "||X_INSURER_SERIAL_NO||" and x_source_system_cd     ="||'"5"'||" and x_source_system_category_cd ="||'"5"'||" and x_current_ind     = "||'"Y"'||";");    
    if final then call execute('quit;'); run;


%end;

%mend;

%condition;

我先检查表格中是否有行(& row_count) 如果有,

我更新了2列(我需要更新5,我只是从示例中删除它们) 使用名为W4TWGKJ6的工作表。

此更新需要永久。 事实上,我每次都停止了这个过程,因为它工作了几个小时而没有返回任何东西....

有没有人知道这个问题的更好解决方案?

提前致谢, 加仑

1 个答案:

答案 0 :(得分:2)

我建议在datastep中使用MODIFY语句: 对于BY变量,两个表中应该具有相同的列名,并按这些变量进行排序。

data dds.insurance_policy;
   modify
         dds.insurance_policy
         W4TWGKJ6 (keep= POLICY_NO X_INSURER_SERIAL_NO /* key variables */ 
                       X_STORNO_BY_VERSION STATUS_CHANGE_DT /* ... other variables from source to update target */
         updatemode=nomissingcheck;
   by POLICY_NO X_INSURER_SERIAL_NO;

    if      _iorc_ = %sysrc(_SOK) then do;
      * Update row ;
      replace;
    end;
    else  _error_ = 0;
  run;

有关 iorc 返回值的完整参考,请参阅SAS: How not to overwrite a dataset when the "where" condition in a "Modify" statement does not hold?