1

我有如下代码

data master;
input id name $ status $;
datalines;
1    B    b
2    C    c
3    A    a
;;;;
run;

PROC SQL;
ALTER TABLE master
ADD PRIMARY KEY (id);
QUIT;

data transaction;
input name $ status $;
datalines;
A    f
F    f
E    e
D    d
B    z
C    x
;;;;
run;

proc sort data = master;
by name;
run;

proc sort data = transaction;
by name;
run;

我想将事务数据集合并到主数据集,并用事务数据集的值更新主数据集的值。为此,我可以使用下面的代码

data have;
retain _maxID; 
merge have addon;
by name;
if id = . then id = _maxID + 1;
_maxID = max(id, _maxID);
run;

结果看起来像这样

id   name   status
3    A      f
1    B      z
2    C      x
4    D      d
5    E      e
6    F      f

但是,主数据集被重置,我失去了主数据集 id 列的主键约束。

据我所知,合并、设置和更新命令创建新数据集,而不是更新当前数据集。

modify 语句是唯一更新当前数据集的语句,但是将上述代码中的 merge 语句替换为 modify 不起作用。

我可以通过在合并后恢复主数据集的主要约束来解决这个问题,但这不是一个好的解决方案。

除了这个还有其他方法吗?帮助表示赞赏,并提前感谢。

4

1 回答 1

4

正如您所说,唯一不创建新数据集的语句是 MODIFY,但您可以使用它来实现您的目标。这里有一篇关于使用 MODIFY 的好 SUGI 论文

这是您可以使用的代码,我已将 ID 设置为在此示例中有效的当前迭代,但我会检查它是否适合您的实际目的。

data master;
modify master transaction;
by name;
select (_IORC_);
    when (%sysrc(_SOK)) replace;
    when (%sysrc(_DSENMR)) do;
        id=_n_;
        output;
        _error_=0;
        end;
    otherwise; 
end;
run;

这里有一个类似的已回答问题,提供了更多详细信息。

链接:-类似的语句在 sas 中合并 sql

于 2013-04-09T09:02:43.937 回答