类似的声明合并在SAS SQL(similar statement to merge sql in

2019-10-17 02:34发布

嗨,大家好,我需要合并在SAS两个表

但就像在一个SQL合并语句的条件:

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 ...

有财产以后这样呢?

如果没有,你能告诉我,我怎么能做出这种有附加条件的?

Answer 1:

我不知道这样做的任何直接的方式。 当我在过去已经做了我第一次追加新行(使用proc append ),然后有第二个步骤来modify现有行。 对于修改步骤中,您需要使用datastep的组合与setmodify ,如果你想重建表中,在一个单一datastep声明。 这样做的好处是,它是少了很多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;

我要补充一点,如果性能是不是你好得多的问题只是重新从头开始创建表。



Answer 2:

您可以使用MODIFY插入新行以及替换现有的数据。 该代码会是这个样子(我不能没有知道你是什么样的匹配上任何其他条件,你可能有更具体的)。 作为一个独立的查找,对主数据集在交易数据集的每一行进行警告,只是一个字,如果两个你的数据集都大,那么以这种方式使用MODIFY是非常低效的。 使用索引,如@罗布的解决方案,将提高在这种情况下的性能。 替代方案,如@Rob说,是使用UPDATE(类似修改此处),或者只是一个标准的MERGE,这两者取代现有的数据集,而不是就地修改。 最后一个选择是使用SQL PROC在那里你可以使用类似于当前的代码的东西。

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;


文章来源: similar statement to merge sql in sas
标签: sql merge sas