在sas中合并sql的类似语句

时间:2012-07-31 15:35:28

标签: sql merge sas

大家好我需要在Sas中合并两个表

但是有一个类似于sql merge语句的条件:

MERGE INTO TABLE_NAME USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...

有类似的东西?

如果没有,你能不能告诉我怎么能以条件进行这种追加?

2 个答案:

答案 0 :(得分:1)

您可以使用MODIFY插入新行以及替换现有数据。代码看起来像这样(我不能更具体,不知道你匹配的是什么以及你可能有的任何其他条件)。只是警告,如果两个数据集都很大,那么以这种方式使用MODIFY是非常低效的,因为对事务数据集中的每一行的主数据集执行单独的查找。使用索引(如@ Rob的解决方案)将提高此实例的性能。正如@Rob所说,替代方案是使用UPDATE(类似于此处的MODIFY)或仅使用标准MERGE,两者都替换现有数据集而不是在适当位置进行修改。最后一个选项是使用PROC SQL,您可以使用与当前代码类似的东西。

data master;
modify master (in=a) transaction (in=b);
by id;
if not a and <condition> then do;
    _error_=0;
    output;
    end;
else if a and b and <condition> then replace;
run;

答案 1 :(得分:0)

我不知道有任何简单的方法。当我在过去完成它时,我首先添加新行(使用proc append),然后向modify现有行添加第二步。对于修改步骤,如果要在原位重建表,则需要在单个datastep中使用datastep与setmodify语句的组合。这样做的好处是它的I / O要少得多(如果它是一个大表,只有一小部分需要更新),它会保留现有索引。缺点是它复杂得多。代码看起来像这样:

  **
  ** REPLACE VALUES IN CPANEL.PW_STAT WITHOUT REBUILDING THE ENTIRE TABLE.
  *;
  data cpanel.pw_stat;

    set redirect_updates;
    modify cpanel.pw_stat key=primary;

    select(_iorc_);  
      when(%sysrc(_sok)) do;
        * MATCHED TRANSACTION DATASET TO MASTER DATASET. REPLACE THE VALUE;
        if date_redirected ne tmp_date_redirected then do;
          date_redirected = tmp_date_redirected;
          replace;
        end;
      end;
      when(%sysrc(_dsenom)) do;
        * NO MATCH. DO NOT ADD OBS OR REPLACE OBS OR DELETE OBS.  RESET ERR AND DO NOTHING.;
        _error_ = 0;
      end;
      otherwise do;
        put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
        put 'Program terminating. DATA step iteration # ' _n_;
        put _all_;
        stop;
      end;
    end;
  run;

我应该补充一点,如果性能不是问题,那么只需从头开始重新创建一个表就好了。